【问题标题】:IDictionary`2 not assignable from Dictionary`2IDictionary`2 不能从 Dictionary`2 分配
【发布时间】:2018-04-17 11:29:00
【问题描述】:

我想确定给定的Type 对象是否引用了通用字典。为此,我尝试了this answer 的解决方案。但令我惊讶的是,下面的测试代码打印出not a generic dictionary!

private void Test()
{
    var dict = new Dictionary<string, string>();
    var type = dict.GetType();
    
    if (type.IsGenericType &&
            typeof(IDictionary<,>).IsAssignableFrom(type.GetGenericTypeDefinition()))
        Console.WriteLine("a generic dictionary");
    else
        Console.WriteLine("not a generic dictionary!");
}

怎么可能IDictionary`2 不能从Dictionary`2 分配,或者我有什么根本错误?

以防万一,我在 Visual Studio 2015 中使用 .NET 4.6 作为目标。

【问题讨论】:

  • 询问开放泛型类型的可分配性是否有意义?它们甚至不存在...注意typeof(IDictionary&lt;string,string&gt;).IsAssignableFrom(type) 将返回true
  • @MarcGravell 在我的真实代码类型中是通过反射确定的,所以它可以是任何东西。在这一点上,我只想知道它是否是用于选择适当 GUI 组件的通用字典。 KeyValue 的具体类型将在稍后在该组件中确定和处理。
  • 是的,你不能那样做;您可以检查type 实现了哪些接口,并且对于每个:查看接口类型是否为泛型类型,如果是:检查泛型类型定义是否为typeof(IDictionary&lt;,&gt;),但是:您可以'不要使用IsAssignableFrom,因为在此上下文中简单地没有定义可分配性

标签: c# generics reflection types


【解决方案1】:

您需要搜索类型的接口并检查是否有 IDictionary&lt;K, V&gt; 接口的实例化:

bool isDict = type.GetInterfaces().Any(it => it.IsGenericType && it.GetGenericTypeDefinition() == typeof(IDictionary<,>));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2010-09-24
    • 2011-09-24
    • 2010-12-08
    相关资源
    最近更新 更多