c# - 如何将集合初始值设定项语法与 ExpandoObject 一起使用?

标签 c# dynamic syntactic-sugar expandoobject object-initializer

我注意到新的 ExpandoObject工具 IDictionary<string,object>有必要的 IEnumerable<KeyValuePair<string, object>>Add(string, object)方法,因此应该可以使用集合初始化语法将属性添加到 expando 对象,就像将项目添加到字典中一样。

Dictionary<string,object> dict = new Dictionary<string,object>() 
{
    { "Hello", "World" }
};

dynamic obj = new ExpandoObject()
{
    { "foo", "hello" },
    { "bar", 42 },
    { "baz", new object() }
};

int value = obj.bar;

但似乎没有办法做到这一点。错误:

'System.Dynamic.ExpandoObject' does not contain a definition for 'Add'

我认为这不起作用,因为接口(interface)是显式实现的。 但是有什么办法可以解决这个问题吗?这很好用,

IDictionary<string, object> exdict = new ExpandoObject() as IDictionary<string, object>();
exdict.Add("foo", "hello");
exdict.Add("bar", 42);
exdict.Add("baz", new object());

但是集合初始化器的语法要简洁得多。

最佳答案

我之前曾多次需要一个简单的 ExpandoObject 初始化器,通常使用以下两种扩展方法来完成类似于初始化器语法的操作:

public static KeyValuePair<string, object> WithValue(this string key, object value)
{
    return new KeyValuePair<string, object>(key, value);
}

public static ExpandoObject Init(
    this ExpandoObject expando, params KeyValuePair<string, object>[] values)
{
    foreach(KeyValuePair<string, object> kvp in values)
    {
        ((IDictionary<string, Object>)expando)[kvp.Key] = kvp.Value;
    }
    return expando;
}

然后你可以这样写:

dynamic foo = new ExpandoObject().Init(
    "A".WithValue(true),
    "B".WithValue("Bar"));

一般来说,我发现有一个扩展方法来构建 KeyValuePair<string, object>来自字符串键的实例派上用场。您显然可以将名称更改为类似 Is 的名称这样你就可以写"Key".Is("Value")如果您需要更简洁的语法。

关于c# - 如何将集合初始值设定项语法与 ExpandoObject 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5910331/

相关文章:

c# - 需要与 MAC 建立有效连接。请确保已建立连接

javascript - 具有动态内容和弹出窗口的自定义 Twitter 按钮

metaprogramming - 在 OCaml 顶层嵌入领域特定语言——是否嵌入 Camlp4?

.Net 参数属性使命名/可选参数仅在内部/私有(private)可见?

javascript - 将 draw.io 图渲染为 png

c# - 自动优化 Windows 窗体 InitializeComponent 的性能

c# - 为什么无法在 asp.net 中获取正确的下拉列表值

R dplyr 对仅由其字符串名称已知的列进行操作

c++ - 动态分配不起作用

C# - 输出参数的语法糖?