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

时间:2011-10-19 09:54:16

标签: c# reflection

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

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

    invocation.Proceed();
}

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

if (invocation.Method.IsPropertySetAccessor)

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

6 个答案:

答案 0 :(得分:16)

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

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

(灵感取自Marc's answer to a related question。)

答案 1 :(得分:5)

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

MethodInfo

答案 2 :(得分:3)

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

答案 3 :(得分:-1)

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

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

  • 如果属性访问器接受一个参数并返回void这是一套
  • 如果属性访问者返回一个值但未选择参数,则为获取

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

答案 4 :(得分:-1)

来自MethodInfo对象的

获取MemberType属性,该属性应该说是Property type,因此您应该能够将其转换为PropertyInfo。该对象公开属性CanWrite,告诉它是否是一个setter。

答案 5 :(得分:-4)

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