I have this simple interface in .net-6/C#9 with nullable reference types turned on:
public interface IMyInterface
{
Task<MyModel?> GetMyModel();
}
How do I detect by reflection that the generic argument MyModel of method's return type is in fact declared as nullable reference type MyModel? ?
typeof(IMyInterface).GetMethods()[0].ReturnType...??
I tried using NullabilityInfoContext but the Create method accepts PropertyInfo, ParameterInfo, FieldInfo, EventInfo which does not really help here or I can't figure out how.
The solution from here also accepts only PropertyInfo, FieldInfo and EventInfo
I also tried observing the attributes from method.ReturnType.GenericTypeArguments[0] but there is no difference between methods that return Task<MyModel> and Task<MyModel?>

Use MethodInfo.ReturnParameter for NullabilityInfoContext:
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
To analyze nullable attributes methodInfo.ReturnTypeCustomAttributes.GetCustomAttributes(true) can be used.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With