الثقة الجزئية:كيفية إنشاء مثيل لنوع عام بدون وسيطة نوع عام

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

سؤال

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

هنا هو ما حاولت حتى الآن:

private INonGenericInterface CreateInstance(Type type)
{
    // Activator.CreateInstance fails
    var instance = Activator.CreateInstance(
            typeof(InternalGenericType<>).MakeGenericType(type));

    // Invoking the default constructor of that type fails.
    var producer = typeof(InternalGenericType<>)
        .MakeGenericType(type)
        .GetConstructor(new Type[0])
        .Invoke(null);

    return (INonGenericInterface)producer;
}

هذا هو نوعي الداخلي.لا شيء يتوهم:

internal class InternalGenericType<T> : INonGenericInterface
    where T : class
{
    public InternalGenericType()
    {
    }
}

حتى أنني حاولت إساءة استخدام Nullable<T> هيكل كمصنع لإنشاء مصنع يمكن أن ينتج نوعي الداخلي.ومع ذلك ، الافتراضي Nullable<T> الحصول على تحويلها إلى مراجع فارغة:

internal static class InternalGenericTypeFactory
{
   public static INonGenericInterface Create(Type serviceType)
   {
      var nullType = typeof(Nullable<>).MakeGenericType(
         typeof(Factory<>).MakeGenericType(serviceType));

      // Activator succesfully creates the instance, but .NET
      // automatically converts default Nullable<T>s to null.
      object nullInstance = Activator.CreateInstance(nullType);

      var getValueMethod =
         nullType.GetMethod("GetValueOrDefault", new Type[0]);

      // Invoke fails, because nullInstance is a null ref.
      var factory = getValueMethod.Invoke(nullInstance, null);

      return ((IFactory)factory).CreateInstance();
   }

   internal interface IFactory
   {
      INonGenericInterface CreateInstance();
   }

   internal struct Factory<T> : IFactory where T : class
   {
       public INonGenericInterface CreateInstance()
       {
           return new InternalGenericType<T>();
       }
   }
}

كما يمكنك أن تتخيل ، لا أريد أن أجعل هذا النوع عاما ، لأنه سيلوث واجهة برمجة التطبيقات الخاصة بي.أنا حاليا خارج الأفكار.ما هي خياراتي?ماذا يمكنني أن أفعل لإنشاء هذا النوع الداخلي?

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

المحلول

البديل الثالث هو دعم نوع من نمط المصنع الذي سيحتوي على طريقة لتثبيت النوع الداخلي.ويمكنك فضح المصنع أو جعل نوع المصنع العام.

public class TypeFactory
{
    public static object Create<T>()
    {
         return new MyInternalType<T>();
    }
}

يمكنك ترك الطبقة كما الداخلية ويمكنك استدعاء طريقة تيبيفاكتوري عن طريق التفكير.

public object CreateType(System.Type type)
{
    Type typeFactory = typeof(TypeFactory);
    MethodInfo m = typeFactory.GetMethod("Create").MakeGenericMethod(type);
    return m.Invoke(null, null);
}

أعتقد أن تيبيفاكتوري الخاص بك يجب أن تكون عامة ، فإنه لا يمكن أن يكون داخليا.

نصائح أخرى

لديك خياران:

  1. اجعل النوع عاما
  2. تجنب استخدام الانعكاس للقيام بذلك ، استخدم الأدوية الجنيسة بدلا من ذلك.

إذا كان من الممكن تجنب الضمانات لمجرد أنك لم تعجبك ، فلن تكون هناك حاجة إلى الحصول عليها على الإطلاق.

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