Каков наилучший способ создания универсального из его имени? - PullRequest
3 голосов
/ 25 сентября 2008

Предполагая, что у меня есть только имя класса универсального элемента в виде строки в форме «MyCustomGenericCollection (of MyCustomObjectClass)» и я не знаю сборку, из которой она происходит, каков самый простой способ создать экземпляр этого объекта ?

Если это поможет, я знаю, что класс реализует IMyCustomInterface и является сборкой, загруженной в текущий домен приложения.

Маркус Олссон привел отличный пример здесь , но я не понимаю, как применить его к генерикам.

Ответы [ 3 ]

8 голосов
/ 25 сентября 2008

После того, как вы его проанализируете, используйте Type.GetType (string) , чтобы получить ссылку на задействованные типы, затем используйте Type.MakeGenericType (Type []) для создания конкретный родовой тип вам нужен. Затем используйте Type.GetConstructor (Type []) , чтобы получить ссылку на конструктор для определенного универсального типа, и, наконец, вызовите ConstructorInfo.Invoke , чтобы получить экземпляр объекта.

Type t1 = Type.GetType("MyCustomGenericCollection");
Type t2 = Type.GetType("MyCustomObjectClass");
Type t3 = t1.MakeGenericType(new Type[] { t2 });
ConstructorInfo ci = t3.GetConstructor(Type.EmptyTypes);
object obj = ci.Invoke(null);
2 голосов
/ 25 сентября 2008

В статье MSDN Практическое руководство. Изучение и создание универсальных типов с помощью Reflection описывает, как можно использовать Reflection для создания экземпляра универсального типа. Надеемся, что использование этого в сочетании с образцом Маркса поможет вам начать.

1 голос
/ 25 сентября 2008

Если вы не против перевода на VB.NET, то что-то вроде этого должно работать

foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
    // find the type of the item
    Type itemType = assembly.GetType("MyCustomObjectClass", false);
    // if we didnt find it, go to the next assembly
    if (itemType == null)
    {
        continue;
    }
    // Now create a generic type for the collection
    Type colType = assembly.GetType("MyCusomgGenericCollection").MakeGenericType(itemType);;

    IMyCustomInterface result = (IMyCustomInterface)Activator.CreateInstance(colType);
    break;
}
...