如何创建受运行时变量影响的自定义属性? (例如PrincipalPermissionAttribute)

时间:2010-11-17 15:02:40

标签: c# .net attributes

如何在每次调用方法时创建一个测试变量的属性?

PrincipalPermissionAttribute附加到某个方法时(如下所示)。如果不满足参数中指定的规则,则抛出异常。

[PrincipalPermission(SecurityAction.Demand, Role = "Admin"]
public void MyMethod()
{
    //Do something if you are an "Admin"
}

基本上(在此示例中),只要调用MyMethod() ,就会测试Thread.CurrentPrincipal的值,如果它不是角色“Admin”a {{1被抛出。

那么......我如何模仿这种行为?我想要一个方法属性,它对运行时变量做出“反应”。我在网上找到的大多数属性示例都涉及将显示名称附加到属性或类似内容。

3 个答案:

答案 0 :(得分:2)

为此使用AOP framework,以便在遇到某种方法时注入代码。您也可以通过.NET框架使用ContextBoundObject进行本地化;这可能是他们在框架中使用的内容。

答案 1 :(得分:1)

您对.NET属性的理解似乎有些混乱。

属性是一种将元信息附加到类和程序集以进行反射的方法。

属性通常不包含行为。它们只是数据。

您在PrincipalPermissionAttribute看到的是正在调用的.NET运行时安全系统。调用方法时,安全性进程会检查方法上与安全性相关的属性。属性的存在指导安全过程的行为。

如果你想让一个属性改变程序的行为,首先需要积极寻找属性。

答案 2 :(得分:0)

你在考虑这个错误。并不是该属性具有变化的值,它使用该属性的代码的解释基于运行时状态。在您给出的示例中,可能的情况是检查该属性的代码也会检查Thread.CurrentPrinciple并根据该操作执行操作。该属性除了存储一些常量字段外什么都不做。如果你做同样的事情,这是最好的。还要记住,在方法(或其他任何东西)上放置属性并不会神奇地做任何事情。您必须拥有通过反射获取这些属性的代码,并以一些有用且相关的方式解释其中的数据。因此,它取决于您的解释器代码,而不是属性。