C# 如何强制构造某些自定义属性?

C# 如何强制构造某些自定义属性?,c#,.net,C#,.net,根据,在调用GetCustomAttributes()方法之前,属性构造函数不会运行。 这将实例化类所拥有的每个属性。 强制构造某个自定义属性的最有效方法是什么?在初始化类时,我只想实例化特定的属性,而不是所有属性 [RegularAttribute("Dont_turn_me_on_yet")] public class MyClass { public int Value { get; set; } [SpecialAttribute("On_RightAway_Pleas

根据,在调用
GetCustomAttributes()
方法之前,属性构造函数不会运行。 这将实例化类所拥有的每个属性。 强制构造某个自定义属性的最有效方法是什么?在初始化类时,我只想实例化特定的属性,而不是所有属性

[RegularAttribute("Dont_turn_me_on_yet")]
public class MyClass
{
    public int Value { get; set; }

    [SpecialAttribute("On_RightAway_Please")]
    public void MethodOne(){}

    [RegularAttribute("Dont_turn_me_on_yet")]
    public void MethodTwo(){}
}

static void Main()
{
   var mc = new MyClass(); //SpecialAttribute constructor is called right away, but not RegularAttribute
}

你误解了什么是属性。属性是元数据,它们作为对象的一种配方存储在程序集中:

  • 已使用属性的构造函数元数据标记
  • 位置参数值
  • 属性设置器值
就这样。不多也不少

在成员上调用
GetCustomAttributes
时,运行时将使用元数据中存储的配方实例化该成员的属性,并处理该属性


每次调用都会得到一个新实例,因为属性实例只是类,因此是可变的。这样做可以确保获得真正的元数据。如果您对此有性能问题,只需自己缓存它们,并确保不更改它们。

找到了答案。GetCustomAttributes能够按类型获取某些属性。下面的代码不会实例化RegularAttribute。它需要在Unity DI中的基构造函数或`[InjectionMethod]中调用

MethodInfo[] methods = (typeof(MyClass)).GetMethods();
foreach (var method in methods)
{
    var attribute = method.GetCustomAttributes(typeof(SpecialAttributeAttribute), false);
}

欢迎更有效的回答。

对。谢谢你的理论支持。我正在寻找一种解决这个问题的方法。这与微软在CAB的EventBroker订阅中的做法类似。它们也没有神奇地做到这一点:“这些属性是用来简化开发体验的——只要将拥有它们的类的实例添加到WorkItem或CAB中的主机中,它们就会得到处理。”。虽然您可以设计一个基类,在其构造时实例化其派生类的属性,但我认为您在这里有一个。