确定 MethodInfo 实例是否是属性访问器
我正在使用 Castle DynamicProxy 编写装饰代理。我需要代理的拦截器仅拦截属性写入(而不是读取),因此我这样检查方法的名称:
public void Intercept(IInvocation invocation)
{
if (invocation.Method.Name.StartsWith("set_")
{
// ...
}
invocation.Proceed();
}
现在这工作正常,但我不喜欢我的代理对属性的实现方式有深入的了解:我'我想用类似的东西替换方法名称检查:
if (invocation.Method.IsPropertySetAccessor)
不幸的是我的Google-fu让我失败了。有什么想法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我想你可以尝试使用扩展方法:
http://msdn.microsoft.com/en-us/library/bb383977.aspx
I think you may try using extension methods:
http://msdn.microsoft.com/en-us/library/bb383977.aspx
您可以检查是否存在此方法作为设置器的属性(未经测试):(
灵感来自 马克对相关问题的回答。)
You could check whether a property exists for which this method is the setter (untested):
(Inspiration taken from Marc's answer to a related question.)
据我所知,没有任何巫术。您可以,也许,剥离
set_
,查找具有该名称的属性,然后比较MethodInfo
实例(inplication.Method
)到属性访问器(GetSetMethod()
) - 但是,我不能诚实地说(不检查)您是否会获得相同的MethodInfo
实例(即使是相同 方法)。There isn't any voodoo of which I'm aware. You could, perhaps, strip the
set_
, look for a property with that name, and compare theMethodInfo
instance (invocation.Method
) to the property accessor (GetSetMethod()
) - however, I can't honestly say (without checking) whether you will get the sameMethodInfo
instance (even if it is the same method).我不确定 incall.Method 是什么类型,但如果您可以获得 PropertyInfo,则可以使用 IsSpecialName。不幸的是,这不仅表明该属性是 set_ 还是 _get,而且还表明它是否是重载运算符。
I'm not sure what kind of type the invocation.Method is, but if you can get the PropertyInfo you can use the IsSpecialName. Unfortunately this tells not only if the property is a set_ or _get but also if it is an overloaded operator.
首先,您可以检查
MethodInfo
类的MemberType
属性,看看它是否是一个Property
。现在,您应该尝试猜测它是 get 还是 set。如果您不想分析名称(有人可能将方法命名为“set_Something”),那么您可以检查参数。
void
,它是一个集合
您可能只对第一个检查感兴趣
First, you can examine the
MemberType
property ofMethodInfo
class to see if it's aProperty
.Now, you should try to guess if it's a get or a set. If you don't want to analyse the name (someone might name a method "set_Something"), then you can check the arguments.
void
,it is a set
You may be interested only in the first check
从您的 MethodInfo 对象获取 MemberType 属性应该说这是一个 属性类型 因此您应该能够将其转换为 PropertyInfo 代替。该对象公开属性 CanWrite ,该属性告诉这是一个二传手。
from your MethodInfo object get the MemberType property which should say this is a Property type so you should be able to cast it to PropertyInfo instead. that object exposes the property CanWrite which tells if this is a setter.