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

C# 如何创建受运行时变量影响的自定义属性?(例如PrincipalPermissionAttribute),c#,.net,attributes,C#,.net,Attributes,如何创建一个属性,在每次调用该方法时测试变量 将PrincipalPermissionAttribute附加到方法时(如下所示)。如果不满足参数中指定的规则,将引发异常 [PrincipalPermission(SecurityAction.Demand, Role = "Admin"] public void MyMethod() { //Do something if you are an "Admin" } 基本上(在本例中),只要调用MyMethod(),就会测试Thread.

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

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

[PrincipalPermission(SecurityAction.Demand, Role = "Admin"]
public void MyMethod()
{
    //Do something if you are an "Admin"
}
基本上(在本例中),只要调用
MyMethod()
,就会测试
Thread.CurrentPrincipal
的值,如果它不是“Admin”角色,就会抛出
SecurityException


所以。。。我如何模仿这种行为?我想要一个对运行时变量作出“反应”的方法属性。我在web上找到的大多数属性示例都与将显示名称附加到属性或类似的内容有关。

为此,请使用,在命中某个方法时插入代码。您也可以通过.NET framework本机使用;这可能就是他们在框架中使用的方法。

为此使用,在命中某个方法时插入代码。您也可以通过.NET framework本机使用;这可能是他们在框架中使用的。

您认为这是错误的。不是属性的值在变化,而是使用属性的代码对属性的解释基于运行时状态。在您给出的示例中,可能是检查该属性的代码也检查Thread.CurrentPrinciple,并基于此执行操作。该属性只存储几个常量字段,不执行任何操作。最好你也这样做。还要记住,在方法(或任何其他方法)上添加属性并不会神奇地产生任何效果。您必须有代码,通过反射来获取这些属性,并以某种有用且相关的方式解释其中的数据。因此,这取决于您的解释器代码,而不是属性。

您认为这是错误的。不是属性的值在变化,而是使用属性的代码对属性的解释基于运行时状态。在您给出的示例中,可能是检查该属性的代码也检查Thread.CurrentPrinciple,并基于此执行操作。该属性只存储几个常量字段,不执行任何操作。最好你也这样做。还要记住,在方法(或任何其他方法)上添加属性并不会神奇地产生任何效果。您必须有代码,通过反射来获取这些属性,并以某种有用且相关的方式解释其中的数据。因此,这取决于您的解释器代码,而不是属性。

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

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

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

通过
PrincipalPermissionAttribute
可以看到正在调用的.NET运行时安全系统。当方法被调用时,安全过程检查方法上的安全相关属性。属性的存在直接影响安全过程的行为


如果您想让某个属性改变程序的行为,首先需要一些东西来积极地查找该属性。

您对.NET属性的理解似乎有点模糊

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

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

通过
PrincipalPermissionAttribute
可以看到正在调用的.NET运行时安全系统。当方法被调用时,安全过程检查方法上的安全相关属性。属性的存在直接影响安全过程的行为


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

属性没有魔力。主要是在您的
属性
类中,您将在实例化时检查传递给属性构造函数的值是否符合预期,否则您将抛出WhateverException。我已尝试使用它们,但在调用该方法时未输入属性构造函数代码。。。事实上,在很多地方,属性被描述为向方法和属性等附加额外的元数据。这让我觉得它们是在编译时而不是运行时输入的,如果这是真的。。当运行时变量发生变化时,它们的行为有何不同?此外,您只能将常量传递给属性构造函数。
attribute
s没有任何魔力。主要是在您的
属性
类中,您将在实例化时检查传递给属性构造函数的值是否符合预期,否则您将抛出WhateverException。我已尝试使用它们,但在调用该方法时未输入属性构造函数代码。。。事实上,在很多地方,属性被描述为向方法和属性等附加额外的元数据。这让我觉得它们是在编译时而不是运行时输入的,如果这是真的。。当运行时变量发生变化时,它们的行为有何不同?另外,您只能将常量传递给属性构造函数。ContextBoundObject的+1。。。我以前没见过他们。有意思。刚刚发现了这个似乎与+1用于ContextBoundObject。。。我以前没见过他们。有意思。刚刚发现了这个似乎与。。。这听起来很合理,我看到的所有属性使用示例都说相同的“附加额外的元数据”。所以这个安全进程在哪里运行?它只是出现在.Net背景中的东西吗?我