我不太确定 .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
,据记录意味着它成功了,真的很荒谬,也许我不明白它对所谓的成功的定义。
你能给我解释一下它在这种情况下不起作用吗?难道我们没有办法让它发挥作用吗?这对我来说尤其重要,因为我的库项目不依赖于某些依赖项。谢谢!
更新:我希望我的代码在使用反射时应该运行并提供自定义元数据信息(例如属性):
var attrs = typeof(MyType).GetCustomAttributes();
但是我刚刚意识到,它TypeDescriptor
提供了另一种元数据存储,只能通过TypeDescriptor
(而不是通过反射)访问,如下所示:
var attrs = TypeDescriptor.GetAttributes(typeof(MyType));
好吧,如果是这样,那就没用了 =)) ,我们知道这Reflection
是一种非常流行的提取元数据的方法,提供了一个标准的 API 来访问元数据,所有库都将使用反射,所以我们需要一些魔法来注入反射的流程, 不进入TypeDescriptor
's 流。真的让我很困惑,我真的认为这TypeDescriptor
是一个与反射密切相关的强大工具,但看起来它只是另一个非常不同的东西。