我有一个类Example
,其中包含字典对象Dict
,因此,我可以使用"X"
通过键Example.Dict["X"]
访问字典值。
但是,我想知道是否可以按以下方式进行这些访问:Example.X
。
我通常会使用C或C ++中的基本编译器宏来处理此问题,但是看到C#没有此功能,我想知道是否可以通过反射或其他方式实现。
答案 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
这是否是一个好主意对读者来说是一种练习。