Я не очень уверен насчет подобного кода в .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
- это какой-то мощный инструмент, имеющий сильную связь с отражением, но похоже, что это просто еще одна совершенно другая вещь.