المنشط.CreateInstance(سلسلة) و المنشط.CreateInstance<T>() الفرق

StackOverflow https://stackoverflow.com/questions/57439

  •  09-06-2019
  •  | 
  •  

سؤال

لا, هذا ليس سؤال حول الوراثة.

لدي مصنع نمط مع العديد من الطبقات الداخلية منشئات (لا أريد إنشاء مثيل إن لم يكن من خلال المصنع).

مشكلتي هي أن CreateInstance فشل مع "لا parameterless منشئ تعريف هذا الكائن" خطأ إلا إذا كنت تمر "صحيح" على غير العامة المعلمة.

على سبيل المثال

// Fails
Activator.CreateInstance(type);

// Works
Activator.CreateInstance(type, true);

أردت أن تجعل المصنع عام لجعله أسهل قليلا, مثل هذا:

public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance<T>();
    }
}

ولكن كنت غير قادر على العثور على كيفية تمرير ذلك "صحيح" المعلمة على قبول غير المنشئات العامة (الداخلية).

هل فاتني شيء أو لا يمكن ؟

هل كانت مفيدة؟

المحلول

للالتفاف على هذا, ألا يمكنك فقط تغيير الاستخدام الخاص بك على هذا النحو:

public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance(typeof(T), true);
    }
}

المصنع الخاص بك الطريقة سوف لا يزال تكون عامة ، ولكن الدعوة إلى المنشط لن تستخدم عامة الزائد.ولكن يجب أن لا تزال تحصل على نفس النتائج.

نصائح أخرى

إذا كنت على الاطلاق تتطلب أن يكون منشئ الخاص يمكنك محاولة شيء من هذا القبيل:

public abstract class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return (T)Activator.CreateInstance(typeof(T), true);
    }
}

وإلا أنت أفضل حالا إضافة قيد جديد و تسير في هذا الطريق:

public abstract class GenericFactory<T> where T : MyAbstractType, new()
{
    public static T GetInstance()
    {
        return new T;
    }
}

أنت تحاول استخدام GenericFactory قاعدة الطبقة لجميع المصانع بدلا من كتابة كل من الصفر أليس كذلك ؟

إلى جانب المنشط.CreateInstance(typeof(T) ، صحيح) للعمل T يجب أن يكون منشئ افتراضي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top