2008-11-11 23 views
2

我意识到您无法在属性本身中获取目标实体,但在使用CodeAccessSecurityAttribute时关联的Permission对象又如何? Permission对象在运行时被调用,所以看起来应该有一种方法,但我很茫然。检索CodeAccessSecurityAttribute中的目标元素

public sealed class MySecurityAttribute : CodeAccessSecurityAttribute 
{ 
    public override IPermission CreatePermission() 
    { 
     MySecurityPermission permission = new MySecurityPermission(); 

     //set its properties 
     permission.Name = this.Name; 
     permission.Unrestricted = this.Unrestricted; 
     return permission; 
    } 

} 

public class MySecurityPermission : IPermission, IUnrestrictedPermission 
{ 

    public MySecurityPermission(PermissionState state) 
    { 
      // what method was the attribute decorating that 
      // created this MySecurityPermission? 
    } 

    public void Demand() 
    { 
      // Or here? 
    } 
} 

回答

0

好吧,我想你可以使用反射遍历所有加载的程序集扫描,寻找任何类/构件,其具有this作为一个属性。不过,这会很慢,所以这不是你想要经常做的事情,也不是一个大型项目。

+0

是的,这是唯一的解决方案,我可以拿出来,但反射并不是一个项目的大小和频率它需要发生的选项。感谢您的反馈。 – Mike 2008-12-10 16:07:06

1

怎么样走动调用堆栈?至少这会缩小你需要反思的东西。抓住System.Diagnostics.StackTrace并使用GetFrame从您所在的位置向上移动堆栈框架。

虽然它的确很讨厌 - 在我看来,CAS的属性不应该取决于装饰的内容,而应该取决于参数中设置的条件。