我可以将属性与匿名类一起使用吗?

时间:2009-08-01 20:36:53

标签: c# attributes anonymous-types

我有一个匿名课程:

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
};

3 个答案:

答案 0 :(得分:50)

您实际上是在这里创建所谓的匿名类型,而不是动态类型。

不幸的是,没有办法实现你想做的事情。匿名类型是一个非常简单的不可变类型,由名称/值对组成。

匿名类型的C#版本仅允许您自定义基础类型上的名称/值对集。没有其他的。 VB.Net允许稍微更多的定制,因为对可以是可变的或不可变的。既不允许你用属性扩充类型。

如果要添加属性,则需要创建完整类型。

编辑 OP询问是否可以通过反射添加属性。

不能做到这一点。反射是一种检查元数据而不是改变它的方法。因此,它不能用于添加属性。

此外,程序集中的类型定义通常是不可变的,不能在运行时进行变异[1]。这包括向方法添加属性。因此,这里也不能使用像技术这样的其他反射。

[1]一个例外是ENC操作

答案 1 :(得分:9)

首先,这是一种匿名类型。 “动态”这个词可能会让人们认为你在谈论实现动态语义的C#4.0类,你不是这样。

其次,不,你不能做你所要求的。

如果需要为属性指定属性,则返回命名类型,即。正常的类或结构。

答案 2 :(得分:8)

可以使用TypeDescriptor.AddAttributes向匿名实例添加属性。然后,您可以使用TypeDescriptor.GetAttributes访问属性。

这不会将它们添加到对象的 Type 实例中。因此,如果您不控制检索和应用属性的代码,则在您的情况下可能没用。