首页 > 解决方案 > GetTypeDescriptor(Type objectType, object instance) 永远不会被调用?

问题描述

我不太确定 .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是一个与反射密切相关的强大工具,但看起来它只是另一个非常不同的东西。

标签: c#.netreflection.net-standardtypedescriptor

解决方案


推荐阅读