为什么我的 .NET 属性不执行操作?

问题描述 投票:0回答:3

我创建了一个简单的属性:

[AttributeUsage(AttributeTargets.Method)]
public class InitAttribute : System.Attribute
{
    public InitAttribute()
    {
        Console.WriteLine("Works!");
    }
}

我将它应用到一个简单的方法中:

static class Logger
{
    public static string _severity;

    public static void Init(string severity)
    {
        _severity = severity;
    }

    [Init()]
    public static void p()
    {
        Console.WriteLine(_severity);
    }
}

发生的事情非常简单。只是,我希望该属性执行一个操作(打印“有效!”),但这并没有发生。

此外,打印“作品!”当然只是为了调试目的:我想访问instance的属性

_severity
(例如检查是否是
!= null
),但是我一直在阅读有关属性的所有内容(这是非常新的对我来说)是关于通过反射访问class'方法或属性等。一旦我评估了
_severity
,我如何修改装饰方法的行为(在这种情况下,引发异常“Logger 未初始化”并且不执行它)?

感谢任何帮助。

c# reflection attributes
3个回答
12
投票

如果您需要在控件进入方法时执行操作,您应该查看 面向方面的编程PostSharp 等框架。属性并非设计用于自行执行任何操作。它们只是一堆数据(或者元数据,如果你愿意的话)附加到 IL 程序集中的东西,可以在运行时查询。


1
投票

属性只允许修饰类型和成员,属性本身不能访问被修饰的对象。您将必须使用属性的构造函数参数来传递您需要在属性中使用的任何数据。

如果您希望使用属性来自动改变其目标对象的行为,您将不得不查看像 PostSharp 这样的 AOP 解决方案。


1
投票

该属性从未实际实例化,因此它的构造函数从未被调用。在您使用反射检索它之前,该属性一直作为元数据。如前所述,您所追求的是面向方面的编程工具。 PostSharp 通过将程序集更改为构建后步骤来工作。如果您正在使用 Castle WindsorUnity 控制容器的反转,它们也都提供 AOP 功能。

© www.soinside.com 2019 - 2024. All rights reserved.