为什么 EventInfo.EventHandlerType 返回可为 null 的 Type 值?

问题描述 投票:0回答:1

EventHandlerType
类的
System.Reflection.EventInfo
属性被声明为返回可空的
Type?
:

EventInfo.EventHandlerType 属性

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?

c# system.reflection
1个回答
0
投票

我们来看看

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# 中声明的,那么您可以假设它们永远不为空。

© www.soinside.com 2019 - 2024. All rights reserved.