GetTypeDescriptor (тип objectType, экземпляр объекта) никогда не вызывается? - PullRequest
0 голосов
/ 29 мая 2019

Я не очень уверен насчет подобного кода в .NET, но меня интересует .NET Standard или .NET Core, мой пользовательский CustomTypeDescriptor никогда не имеет шансов быть введенным / используемым, потому что пользовательский TypeDescriptionProvider похоже, не работает, вот простая реализация (на самом деле никакой пользовательской логики еще не добавлено):

public class CustomTypeDescProvider : TypeDescriptionProvider
{
    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
    {
        //set breakpoint here and wait forever for its jumping in.
        return base.GetTypeDescriptor(objectType, instance);
    }
}

Я попытался добавить провайдера пользовательского описания, например так:

public class MyType {
    static MyType(){
       TypeDescriptor.AddProvider(new CustomTypeDescProvider(), typeof(MyType));      
    }
    //...
}

, а также TypeDescriptionProviderAttribute, например:

[TypeDescriptionProvider(typeof(CustomTypeDescProvider))]
public class MyType {
   //...
}

Это никогда не доходит до моей установленной точки останова внутри GetTypeDescriptor(Type objectType, object instance). Поэтому, насколько мне известно, он должен вызываться, по крайней мере, когда любой код обращается к метаданным (атрибутам, свойствам, например, с помощью отражения) типа MyType, но всегда кажется, что используется поставщик по умолчанию.

Не возникло никаких исключений, чтобы сообщить мне, что Hey your code will not work, stop hoping for it working, и на самом деле я даже вижу это событие TypeDescriptor.Refreshed, сработавшее после вызова TypeDescriptor.AddProvider, что, как задокументировано, означает, что успешно , ну очень смешно, может быть, я не понимаю его определения так называемого успеха .

Не могли бы вы дать мне какое-либо объяснение его неработоспособности в этом случае? У нас нет никакого способа заставить это работать? Это особенно важно для меня, чтобы мой библиотечный проект не зависел от некоторых зависимостей. Спасибо!

UPDATE : Я ожидаю, что мой код должен работать и предоставлять настраиваемую информацию метаданных (например, атрибуты) при использовании отражения следующим образом:

var attrs = typeof(MyType).GetCustomAttributes();

Однако я только что понял, что, похоже, TypeDescriptor предоставляет другое хранилище метаданных, к которому можно получить доступ только через TypeDescriptor (не через отражение), например:

var attrs = TypeDescriptor.GetAttributes(typeof(MyType));

Ну, если так, то это просто бесполезно =)), мы знаем, что Reflection - это какой-то очень популярный способ извлечения метаданных, предоставляющий стандартный API для доступа к метаданным, все библиотеки будут использовать отражение, поэтому нам нужно немного магии впрыскивать в поток отражения, а не в поток TypeDescriptor. На самом деле это меня смущает, я действительно думал, что TypeDescriptor - это какой-то мощный инструмент, имеющий сильную связь с отражением, но похоже, что это просто еще одна совершенно другая вещь.

...