C# C语言中动态词典的使用#

C# C语言中动态词典的使用#,c#,.net,dynamic,dictionary,C#,.net,Dynamic,Dictionary,我正在使用C#中的动态词典。我面临的问题是TryGetMember的行为,我正在动态字典类中重写它 这是动态字典的代码 class DynamicDictionary<TValue> : DynamicObject { private IDictionary<string, TValue> m_dictionary; public DynamicDictionary(IDictionary<string, TValue> a_dictiona

我正在使用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;
    }
}
类DynamicDictionary:DynamicObject
{
私人字典;
公共动态词典(IDictionary 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(键))
{
a_result=m_dictionary[key];
returnValue=true;
}
其他的
a_结果=空;
返回值;
}
}
在这里,每当我们从外部引用某个键时,TryGetMember就会在运行时被调用,但奇怪的是,binder的Name member总是提供我们从外部引用的键,它总是解析以字母表字符形式写入的键名

e、 g.如果动态图像的对象为:

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 
字典字典yofstringvslistofstrings;
//这里ListOfstring一些字符串列表已经填充了字符串
dictionaryOfStringVsListOfStrings.Add(“Test”,listOfStrings);
动态图像_01=新

DynamicDictionary动态键入的目的是使成员名称本身从源代码成员访问中得到解析

动态类型的工作方式与此处的工作方式完全相同-它不是为了检索变量的值并将其用作成员名称-它是为了使用您在源代码中使用的成员名称(即“somekey”)

听起来您根本不需要动态键入,只需像往常一样使用
字典即可:

List<String> listOfStringsAsValue = dictionary[somekey];
如果您希望能够在列表不存在的情况下尝试获取列表而不创建新列表,则可以添加一个方法来完成此操作


听起来您确实不需要在这里使用DynamicObject。

可能没有正确使用动态字典,但在我的情况下,字典的正常使用将不起作用。我的键是随机填充的,没有任何序列值,这些键实际上是正在添加的字符串(那些实际上将添加到该键的列表中)。在动态字典中,我们只引用键,它会返回值(即字符串列表),如果我在列表中添加字符串,它实际上会添加到要动态填充值的指定键的列表下。
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");