gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:45:44 28 4
gpt4 key购买 nike

我注意到新的 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com