c# - 有没有办法使用不存在的成员变量从字典中选择一个元素?
问题描述
我有一个Example
包含字典对象的类,因此我可以使用Dict
键访问字典值。"X"
Example.Dict["X"]
但是,我想知道是否可以按如下方式执行这些访问:Example.X
.
我通常会使用 C 或 C++ 中的基本编译器宏来处理此问题,但由于 C# 没有此功能,我想知道是否可以通过反射或其他方式实现。
解决方案
你可以这样做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
这是否是一个好主意对读者来说是一个练习。
推荐阅读
- android - React Native 自定义 RefreshControl 组件在 Android 上的 FlatList 中不起作用
- go - Issue in importing gen package
- spring - Gitlab runner cache miss file after stage complete
- python - JSONDecodeError: Expecting value, pytorch
- logging - Log4j2 configuration format with best coverage
- selenium - How to disable dns over https in selenium
- node.js - Looking for time based persistent scheduler - node js
- javascript - 安装的变量未显示在下一个文件中(Vue.js)
- python - python - 添加时间范围作为列名
- rabbitmq - rabbitmq erlang ets rpc:调用 badrpc