我有一种使用泛型的类型。我们称之为FlowerDescriptor<T>
有些花是用数字描述的,有些则用字符串等。
所以,FlowerDescriptor<int>;
FlowerDescriptor<string>;
等
我想要一个机制(可能是扩展方法)来做两件事
看看有没有什么东西是
看看描述符是什么。
即。FlowerDescriptor
。
同样,我也可以从FlowerDescriptor<string>.GetType().IsFlowerDescriptor == truestring.GetType().IsFlowerDescriptor == false
即FlowerDescriptor<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你可以尝试。