如何使用反射在 Task<T> 中获取 T 类型的属性?
Posted
技术标签:
【中文标题】如何使用反射在 Task<T> 中获取 T 类型的属性?【英文标题】:How to get properties of type T in Task<T> using reflection? 【发布时间】:2021-09-02 22:09:55 【问题描述】:我正在尝试使用反射获取方法的返回类型的属性。
我正在使用MethodInfo.ReturnType
获取方法的返回类型,这会产生我的Task<T>
类型,因为我的方法是async
。在这种类型上使用GetProperties
会产生属于Task
的属性:Result
、Exception
、AsyncState
。但是,我想获取底层类型 T 的属性。
带有签名的方法示例:
public async Task<MyReturnType> MyMethod()
var myMethodInfo = MyType.GetMethod("MyMethod");
var returnType = myMethodInfo.ReturnType; // Task<MyReturnType>
var myProperties = returnType.GetProperties(); // [Result, Exception, AsyncState]
如何获取Task中内部类型T的属性而不是Task的属性?
【问题讨论】:
这能回答你的问题吗? C# Get Generic Type Name @Klamsi 不完全是,因为它似乎会得到 Task 而不是 T。不过,我现在已经回答了我自己的问题。 【参考方案1】:您可以使用GetGenericTypeDefinition()
方法确定类型是否为Task
,并使用属性GenericTypeArguments
获取泛型类型参数。
在这种情况下:
var myMethodInfo = MyType.GetMethod("MyMethod");
var returnType = myMethodInfo.ReturnType;
if (returnType.GetGenericTypeDefinition() == typeof(Task<>))
var actualReturnType = returnType.GenericTypeArguments[0]; // MyReturnType
var myProperties = actualReturnType.GetProperties(); // The properties of MyReturnType!
【讨论】:
以上是关于如何使用反射在 Task<T> 中获取 T 类型的属性?的主要内容,如果未能解决你的问题,请参考以下文章