我有一个匿名课程:
var someAnonymousClass = new
{
SomeInt = 25,
SomeString = "Hello anonymous Classes!",
SomeDate = DateTime.Now
};
是否有将属性附加到此课程?反思,其他?我真的希望这样的事情:
var someAnonymousClass = new
{
[MyAttribute()]
SomeInt = 25,
SomeString = "Hello anonymous Classes!",
SomeDate = DateTime.Now
};
答案 0 :(得分:50)
您实际上是在这里创建所谓的匿名类型,而不是动态类型。
不幸的是,没有办法实现你想做的事情。匿名类型是一个非常简单的不可变类型,由名称/值对组成。
匿名类型的C#版本仅允许您自定义基础类型上的名称/值对集。没有其他的。 VB.Net允许稍微更多的定制,因为对可以是可变的或不可变的。既不允许你用属性扩充类型。
如果要添加属性,则需要创建完整类型。
编辑 OP询问是否可以通过反射添加属性。
不能做到这一点。反射是一种检查元数据而不是改变它的方法。因此,它不能用于添加属性。
此外,程序集中的类型定义通常是不可变的,不能在运行时进行变异[1]。这包括向方法添加属性。因此,这里也不能使用像技术这样的其他反射。
[1]一个例外是ENC操作
答案 1 :(得分:9)
首先,这是一种匿名类型。 “动态”这个词可能会让人们认为你在谈论实现动态语义的C#4.0类,你不是这样。
其次,不,你不能做你所要求的。
如果需要为属性指定属性,则返回命名类型,即。正常的类或结构。
答案 2 :(得分:8)
可以使用TypeDescriptor.AddAttributes向匿名实例添加属性。然后,您可以使用TypeDescriptor.GetAttributes访问属性。
这不会将它们添加到对象的 Type 实例中。因此,如果您不控制检索和应用属性的代码,则在您的情况下可能没用。