首页 > 解决方案 > 如何在Task中获取T类型的属性使用反射?

问题描述

我正在尝试使用反射获取方法的返回类型的属性。

我得到了 using 方法的返回类型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#.netreflection

解决方案


您可以使用方法确定类型是否为 a TaskGetGenericTypeDefinition()并使用属性获取泛型类型参数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!
}

推荐阅读