我有以下代码
Type type = ...
var events=type.GetEvents(
BindingFlags.DeclaredOnly
| BindingFlags.Instance
| BindingFlags.Public).ToList();
然而,这也让我返回了声明的事件
父接口。例如
Both
UIElement
ContentElement
实施
IInputElement
它定义了事件
//
// Summary:
// Occurs when the mouse pointer moves while the mouse pointer is over the element.
event MouseEventHandler PreviewMouseMove;
但上面对 GetEvents 的调用具有如上设置的所有绑定标志
返回接口以及两个具体类的事件。
如何过滤掉父接口上定义的事件
获取事件?
请注意,我正在为每个事件生成扩展方法,如下所示
public static
IObservable<EventPattern<MouseButtonEventArgs>>
PreviewMouseLeftButtonDownObserver(this IInputElement This){
return Observable
.FromEventPattern
<MouseButtonEventHandler, MouseButtonEventArgs>
( h => This.PreviewMouseLeftButtonDown += h
, h => This.PreviewMouseLeftButtonDown -= h);
}
所以我只做了事件的根定义,没有派生虚拟或接口实现。
在示例中:
interface IFace
{
event EventHandler A;
}
class Base
{
public virtual event EventHandler B;
public event EventHandler C;
}
class YourType : Base, IFace
{
public event EventHandler A; // implements interface
public override event EventHandler B; // overrides base class implementation
public event EventHandler D; // new event
}
如果您使用反射,您想查看哪个事件typeof(YourType)
?
ANSWER:
你可以使用类似的东西:
events.Where(x =>
x.GetAddMethod().GetBaseDefinition().DeclaringType == type
&& !x.GetAddMethod().IsFinal)
);
where type
就像你的问题一样。第一个标准确保它不是在父类型上定义的事件。第二个标准确保它不是接口实现。您可能不需要第二个标准,具体取决于您的具体设置。
编辑答案
events.Where(x =>{
var addMethod = x.GetAddMethod();
var basetype = addMethod.GetBaseDefinition().DeclaringType;
return basetype == type && (!addMethod.IsFinal || basetype.IsInterface);
})
这一添加确保我也能获得接口。
替代方法:
要确定成员是否实现某个接口,可以使用以下命令:
var interfaceImplementingMethods = new HashSet<MethodInfo>(type.GetInterfaces()
.SelectMany(i => type.GetInterfaceMap(i).TargetMethods));
var result = events.Where(x => !interfaceImplementingMethods
.Contains(x.GetAddMethod()));
即使声明了执行成员,它也应该起作用virtual
(or abstract
)。这必须与GetBaseDefinition()
当然,如果您想排除继承的成员。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)