簡體   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