修改具有属性的方法的返回值

3

I want to have a class like this (pseudocode):

public MyClass
{
   private bool isValid;

   [CheckValid]
   public int DoSomething()
   {
      return 1;
   }
}

现在,我希望我的[CheckValid]属性检查isValid属性,如果为true,则允许执行DoSomething(),或者如果为false,则使DoSomething()返回default(int)(或者至少使DoSomething()内部的代码无法访问)。

属性只有在被检查时(即通过反射)才会被评估,因此我认为这是不可能的。 - transistor1
你有考虑过策略注入吗? - Gayot Fow
1个回答

4
这不是C#的一个特性:属性本身不会被“执行”。然而,有一些扩展框架(如PostSharp)可以允许此类操作 - 基本上它重新编写IL级别的代码以注入功能,通常基于属性。但这需要额外的工具支持。
在C#中,“开箱即用”的最佳选择是:
public int DoSomething() {
    CheckValid(); // might throw an exception
    return 1;
}

那么标准内置的 [Authorize] 属性是如何工作的呢?我想要相同的功能,但使用自己的代码。 - ojek
1
@ojek,那些工作是因为它们适用的框架(MVC 等)通过反射显式检查这些属性,并直接调用它们的代码。这不是作为一种语言特性发生的。 - Marc Gravell
5
举个人的例子,如果我在一个粘性标签上写上“不要打开”,并将标签粘在一个盒子上,这并不能阻止任何人打开盒子。只有当某人特意去寻找这个标签,读懂它的内容并按照标签上的指示执行时,标签才有用。对于像MVC这样的框架,框架会在代表你执行操作之前进行所有这些检查。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接