47

我有一个匿名类:

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

3 回答 3

54

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

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

C# 版本的匿名类型只允许您自定义基础类型上的名称/值对集。没有其他的。VB.Net 允许更多的自定义,因为这些对可以是可变的或不可变的。但是,它们都不允许您使用属性来增加类型。

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

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

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

此外,程序集中的类型定义,一般来说,是不可变的,不能在运行时改变 [1]。这包括向方法添加属性。所以这里也不能使用其他类似反射的技术。

[1] 一个例外是 ENC 操作

于 2009-08-01T20:49:08.607 回答
8

首先,这是一个匿名类型。“动态”这个词可能会让人们认为您在谈论实现动态语义的 C# 4.0 类,但实际上并非如此。

其次,不,你不能按照你的要求去做。

如果您需要为您的属性指定属性,您将返回一个命名类型,即。一个普通的类或结构。

于 2009-08-01T20:44:02.923 回答
7

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

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

于 2012-10-16T14:59:07.227 回答