我有一个字典,其中键和值都是Type
类型,就像这样......
private static Dictionary<Type, Type> myDict;
我尝试做的是将第二个Type
限制为仅从FrameworkElement
继承的类型。
请注意,我没有报道FrameworkElement
个实例,我试图只存储Type
类型的对象,这些对象派生自FrameworkElement
,使得以下语句成立。
var isTypeStorable = typeof(FrameworkElement).IsAssignableFrom(FooType);
那可以吗?
BTW,是的,我知道在添加到字典之前我可以使用上面的内容进行运行时检查(这就是我现在正在做的事情)。我想知道该语言中是否有任何功能可以让我在编译时限制它。
答案 0 :(得分:4)
否,这是不可能的。 FrameworkElement.GetType()
和FooType
在类型系统中没有任何关系,两者都只是Type
s。如果要限制泛型,则必须使用运行时检查和异常,通用约束对此没有帮助。
如果您知道在编译时要存储的内容(或者对某些复杂的反射感到满意),您可以将API更改为不Type
,而是使用通用代码:
public void AddTypeForType(Type x, Type y)
可以替换为
public void AddTypeForType<T1, T2>() where T1 : FrameworkElement
{
myDict.Add(typeof(T1), typeof(T2));
}
然后您可以这样称呼它:
AddTypeForType<FrameworkDerivedClass, MyCustomClass>();
但这更多的是API更改,而不是您问题的答案。
答案 1 :(得分:1)
我认为没有类似的东西,但你可以通过在添加到词典之前检查项目来实现这一点,我的意思是这样的:
让Xx,Yy
成为我想要添加到myDict
的项目所以我可以做的是,先检查是否存在密钥,然后检查值的条件({{1} })
inherit from FrameworkElement.