确定MethodInfo实例是否是属性访问器

我正在使用Castle DynamicProxy编写装饰代理。 我需要代理的拦截器来拦截属性写入(而不是读取)所以我正在检查方法的名称:

public void Intercept(IInvocation invocation) { if (invocation.Method.Name.StartsWith("set_") { // ... } invocation.Proceed(); } 

现在这个工作正常但我不喜欢我的代理知道如何实现属性的事实:我想用类似于以下内容的方法替换方法名称检查:

 if (invocation.Method.IsPropertySetAccessor) 

不幸的是,我的Google-fu让我失望了。 有任何想法吗?

您可以检查是否存在此方法为setter(未测试)的属性:

 bool isSetAccessor = invocation.Method.DeclaringType.GetProperties() .Any(prop => prop.GetSetMethod() == invocation.Method) 

(从Marc对相关问题的回答中得到的启示。)

我没有意识到任何伏都教。 或许,您可以剥离set_ ,查找具有该名称的属性,并将MethodInfo实例( invocation.Method )与属性访问器( GetSetMethod() )进行比较 – 但是,我不能老实说(不检查)是否您将获得相同的MethodInfo实例(即使它相同的方法)。

 if(method.IsSpecialName && method.Name.StartsWith("set_")) { var prop = typeof (Foo).GetProperty(method.Name.Substring(4), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); var accessor = prop.GetSetMethod(); bool isSame = accessor == method; } 

我不确定invocation.Method是什么类型的类型,但如果你可以获得PropertyInfo,你可以使用IsSpecialName 。 不幸的是,这不仅告诉属性是set_还是_get,还告诉它是否是重载运算符。

从您的MethodInfo对象获取MemberType属性,该属性应该说这是一个Property类型,因此您应该能够将其强制转换为PropertyInfo 。 该对象公开了属性CanWrite ,它告诉它是否是一个setter。

首先,您可以检查MethodInfo类的MemberType属性,以查看它是否为Property

现在,您应该尝试猜测它是一个获取还是一组。 如果您不想分析名称(有人可能将方法命名为“set_Something”),那么您可以检查参数。

  • 如果属性访问器接受一个参数并返回void则它是一个集合
  • 如果属性访问器返回一个值而不选择参数, 则它是一个get

您可能只对第一次检查感兴趣

我想你可以尝试使用扩展方法: http : //msdn.microsoft.com/en-us/library/bb383977.aspx