簡體   English   中英

C#中的動態字典用法

[英]Dynamic Dictionary usage in C#

我在C#中使用動態字典。 我面臨的問題是TryGetMember的行為,我在動態字典類中重寫。

這是動態字典的代碼。

class DynamicDictionary<TValue> : DynamicObject
{
    private IDictionary<string, TValue> m_dictionary;

    public DynamicDictionary(IDictionary<string, TValue> a_dictionary)
    {
        m_dictionary = a_dictionary;
    }

    public override bool TryGetMember(GetMemberBinder a_binder, out object a_result)
    {
        bool returnValue = false;

        var key = a_binder.Name;
        if (m_dictionary.ContainsKey(key))
        {
            a_result = m_dictionary[key];
            returnValue = true;
        }
        else            
            a_result = null;

        return returnValue;
    }
}

在這里,每當我們從外部引用一些鍵時,TryGetMember將在運行時被調用,但奇怪的是,binder的Name成員總是給出我們從外面引用的鍵,它總是解析寫為字母字符的鍵名。

例如,如果DynamicDictionary的對象如下:

Dictionary<string,List<String>> dictionaryOfStringVsListOfStrings; 

//here listOfStrings some strings list already populated with strings
dictionaryOfStringVsListOfStrings.Add("Test", listOfStrings); 
dynamic dynamicDictionary_01 = new 
    DynamicDictionary<List<String>(dictionaryOfStringVsListOfStrings);

string somekey = "Test";

//will be resolve at runtime
List<String> listOfStringsAsValue = dynamicDictionary_01.somekey 

現在這里發生的是“somekey”將成為a_binder的值(即a_binder.Name =“somekey”)。 它應該被解析為a_binder.Name =“Test”,然后從動態字典中它將針對此鍵找到listOfStrings(即實際上是“Test”但它不是將值解析為實際變量名而是解析為鍵)。

有沒有解決的辦法?

動態類型的關鍵是使成員名稱本身從源代碼成員訪問中得到解析。

動態類型的工作方式完全符合它的意思 - 它不是設計用於檢索變量的值並將其用作成員名稱 - 它旨在使用您在源代碼中使用的成員名稱(即“somekey”)。

聽起來你真的不需要動態類型 - 只需正常使用Dictionary<string,List<String>>

List<String> listOfStringsAsValue = dictionary[somekey];

編輯:聽起來你真的想要封裝這樣的字典:

public class Foo // TODO: Come up with an appropriate name :)
{
    private readonly Dictionary<string, List<string>> dictionary =
        new Dictionary<string, List<string>>();

    public List<string> this[string key]
    {
        get
        {
            List<string> list;
            if (!dictionary.TryGetValue(key, out list))
            {
                list = new List<string>();
                dictionary[key] = list;
            }
            return list;
        }
    }
}

然后你可以這樣做:

foo["first"].Add("value 1");
foo["second"].Add("value 2")
foo["first"].Add("value 1.1");

如果您希望能夠嘗試獲取列表而不創建新列表(如果它不存在),則可以添加一個方法來執行此操作。

這聽起來好像你需要DynamicObject。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM