EventHandlerType
类的System.Reflection.EventInfo
属性被声明为返回可空的Type?
:
public virtual Type? EventHandlerType { get; }
当然,任何事件都必须有类型——那么为什么返回值可以为空呢?
如果我检查实现的反汇编,我想我发现它不能返回 null:
namespace System.Reflection.TypeLoading
{
/// <summary>
/// Base class for all EventInfo objects created by a MetadataLoadContext.
/// </summary>
internal abstract partial class RoEvent : LeveledEventInfo
{
public sealed override Type EventHandlerType => _lazyEventType ?? (_lazyEventType = ComputeEventHandlerType());
protected abstract Type ComputeEventHandlerType();
private volatile Type? _lazyEventType;
它与类似的属性不同,例如
FieldInfo.FieldType
和 MethodInfo.ReturnType
,它们返回 Type
而不是 Type?
。
EventInfo.EventHandlerType
的来源:
public virtual Type? EventHandlerType
{
get
{
MethodInfo m = GetAddMethod(true)!;
ReadOnlySpan<ParameterInfo> p = m.GetParametersAsSpan();
Type del = typeof(Delegate);
for (int i = 0; i < p.Length; i++)
{
Type c = p[i].ParameterType;
if (c.IsSubclassOf(del))
return c;
}
return null;
}
}
它的工作方式是获取事件的
add
方法,枚举其参数,并返回第一个继承自 Delegate
的方法。如果找不到,则返回 null。
现在,C# 永远不会让您使用不采用单个委托参数的
add
方法声明事件。但也许其他语言的工作方式有所不同。也许运行时并不关心。无论哪种方式,从反射 API 的角度来看,任何事情都可能发生。因此,它可能返回 null。
如果您知道要检查哪些事件,并且知道它们都是在 C# 中声明的,那么您可以假设它们永远不为空。