首页 > 解决方案 > 有没有办法使用不存在的成员变量从字典中选择一个元素?

问题描述

我有一个Example包含字典对象的类,因此我可以使用Dict键访问字典值。"X"Example.Dict["X"]

但是,我想知道是否可以按如下方式执行这些访问:Example.X.

我通常会使用 C 或 C++ 中的基本编译器宏来处理此问题,但由于 C# 没有此功能,我想知道是否可以通过反射或其他方式实现。

标签: c#.netdictionary

解决方案


你可以这样做DynamicObject

public class Example : DynamicObject
{
    public Dictionary<string, string> Dict { get; } = new Dictionary<string, string>() { ["Foo"] = "bar" };

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = null;
        if (!Dict.TryGetValue(binder.Name, out var value))
            return false;
        result = value;
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        if (Dict.ContainsKey(binder.Name))
        {
            Dict[binder.Name] = value?.ToString();
            return true;
        }
        return Dict.TryAdd(binder.Name, value?.ToString());
    }
}

上面的一个例子我已经Dictionary<string,string>用一个默认元素初始化了。这使我可以编写代码,例如:

dynamic ex = new Example();
Console.WriteLine(ex.Foo); // Outputs "bar"

ex.SomethingElse = "SomeValue"; // sets an element in the dictionary

这是否是一个好主意对读者来说是一个练习。


推荐阅读