有没有办法拦截C#中的setter和getter?

Edg*_*lez 31 c# interceptor getter-setter

在Ruby和PHP(我猜其他语言)中,只要设置了属性,就会调用一些实用程序方法.(*instance_variable_set*表示Ruby,*__ set*表示PHP).

所以,假设我有一个像这样的C#类:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,假设如果Person调用类中的任何属性设置器,我想先调用另一个方法,然后继续使用setter的默认行为,这同样适用于属性setter.

这可能吗?


编辑: 我想在不定义支持字段的情况下执行此操作.

Mar*_*ell 28

不一般; 但有几个选择;

  • 继承ContextBoundObject -这不会允许这样做,但在性能开销
  • 编写显式属性(即带有支持字段),并手动添加实用程序方法调用
  • 查看编译时编织器,例如PostSharp - 通常通过发现属性或类似物
  • 查看一些DI/IoC工具(以及其他一些"装饰器"工具)提供的运行时代码生成器 - 它们可以装饰或子类化您的对象以添加额外的代码


Ode*_*ded 14

可以直接在属性体中进行,但是您需要使用适当的后备字段而不是自动实现的属性.

private string firstName;

public string FirstName 
{ 
  get { return firstName;} 
  set 
  {
    if(check(value))
    {
       firstName = value;
    }
  } 
}
Run Code Online (Sandbox Code Playgroud)

即使使用自动实现的属性,您也会获得一个支持字段 - 这是由编译器生成的,您无法直接访问它.


编辑:

看到你不需要支持字段,你还有其他选择 - 使用PostSharp之类的AOP工具可以帮助你.