我正在使用Castle DynamicProxy编写装饰代理。我需要代理的拦截器来拦截属性写入(而不是读取)所以我正在检查方法的名称:
public void Intercept(IInvocation invocation)
{
if (invocation.Method.Name.StartsWith("set_")
{
// ...
}
invocation.Proceed();
}
现在这个工作正常,但我不喜欢我的代理人对如何实现属性有深入了解的事实:我想用类似于以下内容的方法替换方法名称检查:
if (invocation.Method.IsPropertySetAccessor)
不幸的是,我的Google-fu让我失望了。有什么想法吗?
答案 0 :(得分:16)
您可以检查是否存在此方法为setter(未经测试)的属性:
bool isSetAccessor = invocation.Method.DeclaringType.GetProperties()
.Any(prop => prop.GetSetMethod() == invocation.Method)
答案 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)
获取MemberType属性,该属性应该说是Property type,因此您应该能够将其转换为PropertyInfo。该对象公开属性CanWrite,告诉它是否是一个setter。
答案 5 :(得分:-4)
我想您可以尝试使用扩展方法: http://msdn.microsoft.com/en-us/library/bb383977.aspx