如何使用反射在 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&lt;T&gt; 类型,因为我的方法是async。在这种类型上使用GetProperties 会产生属于Task 的属性:ResultExceptionAsyncState。但是,我想获取底层类型 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 类型的属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何反射获取List<T> 中泛型的类型

使用反射获取 T 的类型名称

从 Func<Task<T>> 获取结果

C#泛型列表<T>如何获取T的类型? [复制]

使用反射在 IList<T> 中查找 <T> [重复]

00111_通过反射获取构造方法并使用