gpt4 book ai didi

c# - 如何通过反射忽略父接口(interface)上的事件来获取类型的事件

转载 作者:行者123 更新时间:2023-11-30 15:34:40 25 4
gpt4 key购买 nike

我有以下代码

Type type = ...
var events=type.GetEvents(
BindingFlags.DeclaredOnly
| BindingFlags.Instance
| BindingFlags.Public).ToList();

然而,这也返回了我声明的事件父接口(interface)。例如

两者

UIElement
ContentElement

实现

IInputElement

定义事件

//
// Summary:
// Occurs when the mouse pointer moves while the mouse pointer is over the element.
event MouseEventHandler PreviewMouseMove;

但是上面对 GetEvents 的所有绑定(bind)标志设置如上返回接口(interface)事件以及两个具体类。

如何从中过滤掉在父接口(interface)上定义的事件获取事件?

请注意,我正在为每个事件生成扩展方法,就像这样

public static 
IObservable<EventPattern<MouseButtonEventArgs>>
PreviewMouseLeftButtonDownObserver(this IInputElement This){
return Observable
.FromEventPattern
<MouseButtonEventHandler, MouseButtonEventArgs>
( h => This.PreviewMouseLeftButtonDown += h
, h => This.PreviewMouseLeftButtonDown -= h);
}

所以我只做了事件的根定义,没有派生虚拟或接口(interface)实现。

最佳答案

在例子中:

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) 上使用反射,您想查看哪个事件?

回答:

你可以使用类似的东西:

events.Where(x =>
x.GetAddMethod().GetBaseDefinition().DeclaringType == type
&& !x.GetAddMethod().IsFinal)
);

type 就像您的问题。第一个标准确保它不是在父类型上定义的事件。第二个标准确保它不是接口(interface)实现。您可能不需要第二个条件,具体取决于您的具体设置。

编辑以回答

events.Where(x =>{ 
var addMethod = x.GetAddMethod();
var basetype = addMethod.GetBaseDefinition().DeclaringType;
return basetype == type && (!addMethod.IsFinal || basetype.IsInterface);
})

此添加可确保我也获得接口(interface)。

替代方法:

要确定一个成员是否实现了某个接口(interface),可以使用这个:

var interfaceImplementingMethods = new HashSet<MethodInfo>(type.GetInterfaces()
.SelectMany(i => type.GetInterfaceMap(i).TargetMethods));
var result = events.Where(x => !interfaceImplementingMethods
.Contains(x.GetAddMethod()));

即使实现成员被声明为virtual(或abstract)它也应该工作。当然,如果您还想排除继承的成员,这必须与 GetBaseDefinition() 结合使用。

关于c# - 如何通过反射忽略父接口(interface)上的事件来获取类型的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15895091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com