动态创建匿名类型? [复制]

Posted

技术标签:

【中文标题】动态创建匿名类型? [复制]【英文标题】:Creating an anonymous type dynamically? [duplicate] 【发布时间】:2011-04-30 19:10:53 【问题描述】:

我想创建一个可以动态设置属性名称的匿名类型。它不必是匿名类型。我想要实现的只是动态设置任何对象的属性名称。它可以是 ExpandoObject,但字典对我不起作用。

你有什么建议?

【问题讨论】:

为什么字典不适合你? 因为我必须将它绑定到 Telerik 网格的数据源,并且我还要动态添加网格的列。 【参考方案1】:

只有ExpandoObject 可以有动态属性。

编辑: 这是Expand Object 用法的示例(来自其 MSDN 描述):

dynamic sampleObject = new ExpandoObject();
sampleObject.TestProperty = "Dynamic Property"; // Setting dynamic property.
Console.WriteLine(sampleObject.TestProperty );
Console.WriteLine(sampleObject.TestProperty .GetType());
// This code example produces the following output:
// Dynamic Property
// System.String

dynamic test = new ExpandoObject();
((IDictionary<string, object>)test).Add("DynamicProperty", 5);
Console.WriteLine(test.DynamicProperty);

【讨论】:

是的,我知道。但是我可以从字符串数组中设置 ExpandoObjects 属性吗? ...好吧,或者任何其他实现IDynamicMetaObjectProvider的类型。 ExpandoObject 实现了IDictionary&lt;string,object&gt;,所以是的,您可以将其视为字典来填充它。 我添加了另一个示例。如果它不是你所需要的,那么你在动态下是什么意思? 是的,这正是我的意思,非常感谢!【参考方案2】:

您可以将ExpandoObject 转换为字典并以这种方式填充它,然后您设置的键将显示为 ExpandoObject 上的属性名称...

dynamic data = new ExpandoObject();

IDictionary<string, object> dictionary = (IDictionary<string, object>)data;
dictionary.Add("FirstName", "Bob");
dictionary.Add("LastName", "Smith");

Console.WriteLine(data.FirstName + " " + data.LastName);

【讨论】:

+1 这太疯狂了,我不知道动态有这个能力。其他语言也有类似的功能,这肯定会有一些很好的用例。另一方面,它也可能被非常严重地滥用,使用时应给予应有的尊重。

以上是关于动态创建匿名类型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

匿名类型与动态类型

如何测试一个类型是不是是匿名的? [复制]

如何创建 LINQ 表达式树以选择匿名类型

如何检查 C# 中的动态匿名类型上是不是存在属性?

C# 是否可以将 动态或匿名类型 转成 强类型 ?

C#“动态”无法访问在另一个程序集中声明的匿名类型的属性