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...??
我尝试使用 NullabilityInfoContext
但 Create
方法接受 PropertyInfo
、ParameterInfo
、FieldInfo
、EventInfo
这并没有真正帮助在这里,否则我不知道怎么做。
解决方案也只接受PropertyInfo
、FieldInfo
和EventInfo
我也尝试观察 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)
。
我在 .net-6/C#9 中有这个简单的界面,并且启用了可空引用类型:
public interface IMyInterface
{
Task<MyModel?> GetMyModel();
}
我如何通过反射检测到方法 return 类型的泛型参数 MyModel
实际上被声明为可空引用类型 MyModel?
?
我试过的...
typeof(IMyInterface).GetMethods()[0].ReturnType...??
我尝试使用 NullabilityInfoContext
但 Create
方法接受 PropertyInfo
、ParameterInfo
、FieldInfo
、EventInfo
这并没有真正帮助在这里,否则我不知道怎么做。
解决方案PropertyInfo
、FieldInfo
和EventInfo
我也尝试观察 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)
。