GetInterfaces () возвращает универсальный тип интерфейса с FullName = null - PullRequest
2 голосов
/ 25 июня 2010

Может кто-нибудь объяснить мне, почему GetInterfaces () в приведенном ниже коде возвращает тип интерфейса с FullName = null?

public class Program
{
    static void Main(string[] args)
    {
        Type[] interfaces = typeof (Data<>).GetInterfaces();
        foreach (Type @interface in interfaces)
        {
            Console.WriteLine("Name='{0}' FullName='{1}'", @interface.Name, @interface.FullName ?? "null");
        }
    }
}

public class Data<T> : IData<T>
{
    public T Content { get; set; }
}

public interface IData<T>
{
    T Content { get; set; }
}

Вывод программы:

Name=IData`1' FullName='null'

Я вроде ожидал:

Name=IData`1'
FullName='ConsoleApplication2.IData`1'

Пожалуйста, просветите меня:)

Ответы [ 2 ]

7 голосов
/ 25 июня 2010

http://blogs.msdn.com/b/haibo_luo/archive/2006/02/17/534480.aspx

Обновление: улучшена документация Microsoft:

https://msdn.microsoft.com/en-us/library/system.type.fullname.aspx

Type.FullName имеет значение null, если текущий экземпляр представляет параметр универсального типа, тип массива, тип указателя или тип byref на основе параметра типа, или универсальный тип, который не является определением универсального типа, но содержит параметры неразрешенного типа .

Вот пример ситуации, когда Type.FullName - это null, выкинутая из документации:

    [Fact]
    public void FullNameOfUnresolvedGenericArgumentIsNull()
    {
        Type openGenericType = typeof(Nullable<>);
        Type typeOfUnresolvedGenericArgument = openGenericType.GetGenericArguments()[0];

        Assert.Null(typeOfUnresolvedGenericArgument.FullName);
    }
0 голосов
/ 02 сентября 2018

Вы можете создать метод расширения для исправления ссылки на тип:

public static Type FixTypeReference(this Type type)
{
    if (type.FullName != null)
        return type;

    string typeQualifiedName = type.DeclaringType != null
        ? type.DeclaringType.FullName + "+" + type.Name + ", " + type.Assembly.FullName
        : type.Namespace + "." + type.Name + ", " + type.Assembly.FullName;

    return Type.GetType(typeQualifiedName, true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...