繁体   English   中英

比较IEnumerable的类型<T>

[英]Compare type of IEnumerable<T>

我有一个字典,可以根据传入的值给我返回一个方法。定义如下:

Dictionary<Type, IXmlWriterConverter>

现在,我添加了一个新函数,该函数的Key / type设置为IEnumerable,到目前为止一切顺利。 但是,当我使用包含两个DataTables的List执行单元测试时,字典找不到键,例如,我的类型转换有所不同。

为什么会这样? 解决我的问题的正确尝试是什么?

编辑:对不起,这是要求的代码;-)

生成测试值的函数:

public IEnumerable<DataTable> CreateTestDataTableList()
{
    var resultDataTable = new List<DataTable>();

    resultDataTable.Add(CreateTestTable("testTable1", 2));
    resultDataTable.Add(CreateTestTable("testTable2", 3));

    return resultDataTable;
}

单元测试调用的函数:

public void Write(XmlWriter xmlWriter, object value)
{
    ...
    converter = FindConverter(value.GetType());
}

函数检查字典:

public IXmlWriterConverter FindConverter(Type type)
{
    if(Converters.ContainsKey(type))
    {
        return Converters[type];
    }
    return null;
}

2.编辑:

将值添加到字典的代码:

public void Add(IXmlWriterConverter xmlWriterConverter)
{
    if(Converters.ContainsKey(xmlWriterConverter.InputType))
    {
        Remove(xmlWriterConverter);
    }

    Converters.Add(xmlWriterConverter.InputType, xmlWriterConverter);
}

InputType是转换器的只读(获取)属性。 我检查了添加到字典中的类型,该类型已注册为IEnumerable,但是当我在传递列表时检查typeof时,类型为List而不是IEnumerable。 有人告诉我发生这种情况是因为我将值作为对象传递。

对于我来说,这是一个非常糟糕的代码解决方案,它降低了效率,但是您也可以通过Type上的GetInterfaces()方法进行迭代,如下所示:

List<DataTable> l = new List<DataTable>();
var t = l.GetType();
var ints = t.GetInterfaces();

然后,您可以在类型上进行查找,如果不起作用,请在其接口上进行查找。

但是 ,这感觉像是一个可怕的hack,通常表明还需要做更多的设计工作。 列表类型不能放在字典中吗? 有没有更好的方法来执行此查找?

另外,还有关于字典查找的说明:使用TryGetValue方法的效率更高,如下所示:

public IXmlWriterConverter FindConverter(Type type)
{
    IXmlWriterConverter converter;
    if( Converters.TryGetValue(type, out converter) )
    {
        return converter;
    }

    return null;
}

当您以这种方式执行此操作时,它只会在字典上进行一次查找,而如果您使用ContainsKey,则它必须进行两次查找。

有点hack,但是在查看代码时,我唯一想到的就是添加了另一个通用的write方法:

public void Write<TValue>(XmlWriter writer, TValue value) {
// ...
}

这允许为IEnumerable标识正确的类型,并保留其他Write方法以不破坏任何现有代码。

可能是您尝试检索List类型而不是IEnumerable(继承在这种情况下不起作用)

如果您需要更多详细信息和更确定的答案,请粘贴执行查询的代码:)

您还应该张贴在哪里获取测试值的代码。 但是根据您给出的内容,您是否可能使用非通用的IEnumerable来检索值,而不是用于生成它们的通用版本?

InputType是转换器的只读(获取)属性。 我检查了添加到字典中的类型,该类型已注册为IEnumerable,但是当我在传递列表时检查typeof时,类型为List而不是IEnumerable。 有人告诉我发生这种情况是因为我将值作为对象传递。

就像他们在MythBusters上说的那样,那是您的问题! 即使ListIEnumerable ,代表每个的Type对象绝对也不相同。 用程序员的行话, typeof(List) != typeof(IEnumerable) 这就是查找不起作用的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM