gpt4 book ai didi

c# - 比较 IEnumerable 的类型

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:22 25 4
gpt4 key购买 nike

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

Dictionary<Type, IXmlWriterConverter>

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

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

编辑:抱歉,这是请求的代码;-)

生成测试值的函数:

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();

然后您可以查找类型,如果这不起作用,请查找它的接口(interface)。

但是,这感觉像是一个糟糕的 hack,通常表示需要完成一些更多的设计工作。不可以把List类型放到字典里吗?没有更好的方法来执行此查找吗?

此外,关于进行字典查找的注意事项:使用 TryGetValue 方法更有效,如下所示:

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

return null;
}

当您这样做时,它只会在字典中进行一次查找,而如果您使用 ContainsKey,则它必须进行两次查找。

关于c# - 比较 IEnumerable<T> 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com