【问题标题】:Can I use Attributes with Anonymous classes?我可以将属性与匿名类一起使用吗?
【发布时间】:2010-11-16 02:08:57
【问题描述】:

我有一个匿名类:

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

【问题讨论】:

    标签: c# attributes anonymous-types


    【解决方案1】:

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

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

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

    如果你想添加属性,你需要创建一个完整的类型。

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

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

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

    [1] ENC 操作是一个例外

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 你说得对,我的意思是匿名类型,谢谢你的澄清。
      【解决方案3】:

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

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

      【讨论】:

      • 注意,这会添加类级别属性,而不是问题示例中提到的属性级别属性。
      猜你喜欢
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多