我有一种使用泛型的类型。我们称之为FlowerDescriptor<T>有些花是用数字描述的,有些则用字符串等。
所以,FlowerDescriptor<int>;FlowerDescriptor<string>;
我想要一个机制(可能是扩展方法)来做两件事
看看有没有什么东西是
看看描述符是什么。
即。
FlowerDescriptor
同样,我也可以从FlowerDescriptor<string>.GetType().IsFlowerDescriptor == truestring.GetType().IsFlowerDescriptor == falseFlowerDescriptor<int>得到
new numberedFlower.getType().isFlowerDescriptor==true;
如上所述,但返回类型
class NumberedFlower: FlowerDescriptor<int>
我玩过FlowerDescriptor<string>.GetType().GetFlowerDescriptor() == typeof(string)FlowerDescriptor<int>.GetType().GetFlowerDescriptor() == typeof(int)new NumberedFlower.GetType().GetFlowerDescriptor() == typeof(int)的变体,感觉应该和IsAssignableFrom一起使用。
但没用。如果它添加了泛型类型。
我目前正在探索typeof(FlowerDescriptor<>).IsAssignableFrom(typeof(FlowerDescriptor<string>))以了解可用的接口。如果能真正理解我做错了什么,那就太好了。

最佳答案

除非你想在混合中添加接口,否则你唯一的选择就是
检测类型实际上是aFlowerDescriptor<T>
或者检测类型是否继承自FlowerDescriptor<T>
不幸的是,我认为在打开泛型时不能使用IsAssignableFrom,这意味着我们只能沿着继承链一直走到基类。
下面是一段代码示例,它可以做正确的事情:

public static bool IsFlowerDescriptor(this Type type)
{
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(FlowerDescriptor<>))
        return true;
    if (type.BaseType != null)
        return type.BaseType.IsFlowerDescriptor();

    return false;
}

这里有一个.NET Fiddle你可以尝试。

07-28 13:57