【问题标题】:.NET Attribute Class Plugging.NET 属性类插入
【发布时间】:2010-11-10 15:42:17
【问题描述】:

有没有办法编写一个扩展 .NET Attribute 类的自定义类,以便我可以将该类应用于方法,并且 .NET Framework 在执行该方法之前调用我的类构造函数。这是一个例子

public class TestAttribute : Attribute
{
    public TestAttribute()
    {
        Console.WriteLine("Called");
    }
}

class Program
{
    static void Main(string[] args)
    {
        TestMethod();
    }

    [TestAttribute()]
    public static void TestMethod()
    {

    }

}

我希望在调用TestMethod时,框架会执行TestAttribute()构造函数。

【问题讨论】:

    标签: .net custom-attributes


    【解决方案1】:

    在常规 .NET 中,属性不会引起魔法调用,除了非常有限的一组系统属性(安全性等)。其余部分通过反射检查应用,必须明确完成。

    您可能会查看 PostSharp(现已重命名为 commercial product)。

    【讨论】:

    • 另一个选项(仅限 ASP.NET MVC)是创建 ActionFilterAttribute 的子类。查看示例here
    • @rsenna 这是一个非常具体的示例,最终仍通过反射调用。
    • @Marc Gravell:1)这就是为什么我将其添加为评论,而不是作为回应。 2)它完成了工作(OP想要将运行时行为添加到方法中,我认为他/她不关心实现细节)。 3)我给了你+1,所以不要抱怨! ;-)
    • 我使用 .NET Framework 3.5(Web 表单)。我可以毫无问题地使用 System.Web.Mvc 程序集吗?我在我的机器上找不到这些程序集。如果使用反射会显着影响性能吗?
    • @kumar:不,我认为在 WebForms 中使用 ActionFilterAttribute 不是一个好主意——它是一种 ASP.NET MVC 唯一的方法。您应该尝试 PostSharp 或其他一些 AOP 库。
    【解决方案2】:

    我不这么认为 - 属性只会被反映在代码中的事物读取,它们在正常执行期间不会被调用。

    【讨论】:

      【解决方案3】:

      是的,这是可能的,但不是这样。

      您可以通过使用面向方面的编程来做到这一点。 PostSharp 是一个允许你这样做的框架;它允许您在编译时将方面“编织”到代码中。

      Postsharp

      [Serializable]
      public class TestAttribute : OnMethodInvocationAspect
      {
         public override void OnInvocation()
         {
             Console.WriteLine ("TestAttribute called");
             base.OnInvocation();
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-25
        • 2012-02-09
        相关资源
        最近更新 更多