[英]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上說的那樣,那是您的問題! 即使List
是IEnumerable
,代表每個的Type
對象絕對也不相同。 用程序員的行話, typeof(List) != typeof(IEnumerable)
。 這就是查找不起作用的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.