拦截调用C#中的属性get方法

mic*_*jas 2 .net c# cil dynamic

我们假设我们有这个类:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,是否有可能在C#中拦截对属性get方法的调用,运行其他一些方法并返回该方法的结果而不是属性值?我希望能够在幕后做一些额外的逻辑.缺点是这个类无法更改(在C#级别).也许有些IL?

kmo*_*gom 7

看看PostSharp:http://www.sharpcrafters.com/

这实现了您正在寻找的东西,以及更多.

PostSharp实现面向方面的.NET编程.它是一种商业产品.很酷.

请注意,此问题的任何解决方案都将涉及一些运行时开销(一些内存,一些额外的时间来进行函数调用.)没有什么是完全免费的.

  • PostSharp不会更改类的源代码.它改变了通过编写课程而产生的IL; 我相信原来的海报可以让IL改变. (2认同)

LBu*_*kin 6

如果你的类无法更改,你可以考虑使用像PostSharp这样的工具- 它允许你编织代码来拦截或替换对方法和属性的调用.

如果您可以更改代码,那么只需避免使用自动属性,并显式实现get和set操作.然后你可以做任何你需要的事情.或者,您可以将属性定义为虚拟,并派生另一个类来更改getter和/或setter的行为:

public class Person 
{ 
  public virtual int Id { get; set; } 
  public virtual string Name { get; set; } 
} 

public class PersonDerived : Person
{
  public override int Id { get { ... } set { ... } }
  public override string Name { get { ... } set { ... } }
}
Run Code Online (Sandbox Code Playgroud)

如果您只需要进行单元测试,您可能需要查看MoqTypeMock模拟工具.