你能否限制泛型中的Type类型?

时间:2017-01-05 06:15:11

标签: c# generics type-conversion

我有一个字典,其中键和值都是Type类型,就像这样......

private static Dictionary<Type, Type> myDict;

我尝试做的是将第二个Type限制为仅从FrameworkElement继承的类型。

请注意,我没有报道FrameworkElement个实例,我试图只存储Type类型的对象,这些对象派生自FrameworkElement,使得以下语句成立。

var isTypeStorable = typeof(FrameworkElement).IsAssignableFrom(FooType);

那可以吗?

BTW,是的,我知道在添加到字典之前我可以使用上面的内容进行运行时检查(这就是我现在正在做的事情)。我想知道该语言中是否有任何功能可以让我在编译时限制它。

2 个答案:

答案 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.