动态创建匿名类型?

69

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

您有什么建议吗?


1
为什么字典对你不起作用? - dtb
2
因为我需要将其绑定到Telerik网格的数据源,并且我还要动态添加网格列。 - ward87
2个回答

67

只有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);

8
任何实现了IDynamicMetaObjectProvider接口的类型,包括但不限于ExpandoObject,都可以这样做。 - Jon Skeet
5
ExpandoObject实现了IDictionary<string,object>接口,因此您可以将其视为字典来填充它。 - stevemegson
我实际上想说的是,我能否动态设置ExpandoObject的属性名称?如果可以的话,你能提供一个例子吗? - ward87
非常感谢,但不幸的是这不是我想要的。我想动态设置属性名称...在这种情况下是“.test”... - ward87
2
我添加了另一个例子。如果这不是你需要的,那么你所说的动态是什么意思? - Andrew Bezzub
显示剩余2条评论

43
你可以将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);

4
+1 这相当神奇,我不知道动力学有这种能力。其他语言也有类似的功能,肯定会有一些很棒的用例。另一方面,它也可能被滥用,因此应该恰当使用并给予尊重。 这很神奇,我之前不知道动力学有这样的功能。其他语言也有类似的功能,这肯定会有一些很好的用途。但是,它也可能被糟糕地滥用,所以必须谨慎使用并给予尊重。 - AaronLS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接