【问题标题】:How to determine the attached type from within a custom attribute?如何从自定义属性中确定附加类型?
【发布时间】:2010-09-21 12:14:28
【问题描述】:

我有一个自定义属性,可以分配给一个类[FooAttribute]。我想做的是,从属性中确定哪种类型实际使用了我。例如如果我有:

[FooAttribute]
public class Bar
{
}

在 FooAttribute 的代码中,如何确定是 Bar 类添加了我?我不是专门寻找 Bar 类型,我只是想使用反射设置一个友好的名称。例如

[FooAttribute(Name="MyFriendlyNameForThisClass")]
public class Bar
{
}

public class FooAttribute()
{
  public FooAttribute()
  {
    // How do I get the target types name? (as a default)
  }
}

【问题讨论】:

    标签: c# .net reflection custom-attributes


    【解决方案1】:

    首先,您可以考虑使用现有的[DisplayName] 来保持友好名称。如前所述,您根本无法在属性中获取此信息。您可以从 Bar 中查找属性,但通常,从属性中执行此操作的唯一方法是将类型 传递给 属性 - 即

    [Foo("Some name", typeof(Bar)]
    

    你到底想做什么?可能还有其他选择...

    注意对于 i18n、resx 等;您可以继承 DisplayNameAttribute 并通过覆盖 DisplayName getter 来提供键的查找。

    【讨论】:

      【解决方案2】:

      详细说明。内置或自定义的属性只是类或类成员的元数据,属性本身并没有表示它与某物相关联。

      • 类型知道它自己的元数据
      • 元数据(在本例中为属性)不知道它属于谁

      【讨论】:

        【解决方案3】:

        从您的句子“我只想使用反射设置一个友好的名称”中,我认为您想在运行时将“MyFriendlyNameForThisClass”名称设置为属性。如果是这样,我认为这是不可能的。请参阅this thread

        【讨论】:

          【解决方案4】:

          这很笨拙,但您可以遍历程序集中的所有类,测试每个“是”此实例的自定义属性。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-02-13
            • 2017-10-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多