C# 使用反射从方法的 return 类型的泛型参数中检测可为空的引用类型

C# detect nullable reference type from generic argument of method's return type using reflection

我在 .net-6/C#9 中有这个简单的界面,并且启用了可空引用类型:

public interface IMyInterface
{
    Task<MyModel?> GetMyModel();
}

我如何通过反射检测到方法 return 类型的泛型参数 MyModel 实际上被声明为可空引用类型 MyModel?

我试过的...

typeof(IMyInterface).GetMethods()[0].ReturnType...??

我尝试使用 NullabilityInfoContextCreate 方法接受 PropertyInfoParameterInfoFieldInfoEventInfo 这并没有真正帮助在这里,否则我不知道怎么做。

解决方案也只接受PropertyInfoFieldInfoEventInfo

我也尝试观察 method.ReturnType.GenericTypeArguments[0] 的属性,但是 return Task<MyModel>Task<MyModel?>

的方法没有区别

NullabilityInfoContext使用MethodInfo.ReturnParameter:

Type type = typeof(IMyInterface);
var methodInfo = type.GetMethod(nameof(IMyInterface.GetMyModel));

NullabilityInfoContext context = new();
var nullabilityInfo = context.Create(methodInfo.ReturnParameter); // return type
var genericTypeArguments = nullabilityInfo.GenericTypeArguments;
var myModelNullabilityInfo = genericTypeArguments.First(); // nullability info for generic argument of Task
Console.WriteLine(myModelNullabilityInfo.ReadState);    // Nullable
Console.WriteLine(myModelNullabilityInfo.WriteState);   // Nullable

要分析可为 null 的属性,可以使用 methodInfo.ReturnTypeCustomAttributes.GetCustomAttributes(true)