有没有一种方法可以使用不存在的成员变量从字典中选择一个元素?

时间:2019-05-24 12:04:34

标签: c# .net dictionary

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

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

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

1 个答案:

答案 0 :(得分:3)

您可以使用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

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