Почему Assembly.GetType () не работает для экземпляров универсального типа? - PullRequest
1 голос
/ 03 апреля 2019

У меня есть универсальный класс в отдельной сборке:

class MyGenericClass<T> { }

В другой сборке я пытаюсь сделать это:

var assembly = System.Reflection.Assembly.LoadFrom(@"C:\path-to\MyClassLibrary.dll");  
var t1 = assembly.GetType("MyClassLibrary.MyGenericClass`1");
var t2 = assembly.GetType("MyClassLibrary.MyGenericClass`1[System.String]");

Теперь первый вызов GetType вернет универсальный тип, а второй вернет ноль.

Я тестировал то же самое с типом List<>:

var assembly2 = System.Reflection.Assembly.LoadFrom(@"C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll");
var t3 = assembly2.GetType("System.Collections.Generic.List`1[System.String]");

Теперь, на этот раз это работает. Тип List<String> возвращается. Что оставляет меня в замешательстве.

Почему GetType() не получит мой тип при вызове с параметром типа [System.String], когда он может получить тип List при вызове с тем же параметром типа?

И есть ли другой способ завладеть моим типом? Я знаю, что могу разобрать имя типа, извлечь части MyClassLibrary.MyGenericClass'1 и [System.String], а затем создать экземпляр универсального типа, основанного на этих типах, но я, вероятно, что-то напутал, поэтому я искал более простое, Твердый, встроенный способ получить объект этого типа.

1 Ответ

2 голосов
/ 03 апреля 2019

Строка должна включать полностью определенное имя типа в другой сборке:

var t2 = assembly.GetType("MyClassLibrary.MyGenericClass`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]");

Возможно, вы захотите реализовать собственный метод, который дает вам тип:

static Type GetType(Assembly assembly, string typeName)
{
    Type type = assembly.GetType(typeName);
    if (type == null)
    {
        int index = typeName.IndexOf("`1");
        if (index != -1)
        {
            index += 2;
            ReadOnlySpan<char> span = typeName.AsSpan();
            type = Type.GetType(span.Slice(0, index).ToString());
            return type.MakeGenericType(Type.GetType(span.Slice(index + 1, span.Length - index - 2).ToString()));
        }
    }
    return type;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...