如何使用反射检测通用值任务类型 ValueTask<T>



我正试图找到一个Type属性或方法,使用该属性或方法可以确定我们正在处理一个泛型ValueTask。

我测试了一些选项,但似乎只有Name属性是指示性的——通用值任务以字符串"ValueTask`"开头:

https://dotnetfiddle.net/drzlrn

using System;
using System.Linq;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
Console.WriteLine("1:" + typeof(ValueTask).IsAssignableFrom(typeof(ValueTask<>)));
Console.WriteLine("2:" + typeof(ValueTask).IsAssignableFrom(typeof(ValueTask<int>)));
Console.WriteLine("3:" + typeof(ValueTask<>).IsAssignableFrom(typeof(ValueTask<>)));
Console.WriteLine("4:" + typeof(ValueTask<int>).IsAssignableFrom(typeof(ValueTask<int>)));
Console.WriteLine("5:" + typeof(ValueTask<>).IsAssignableFrom(typeof(ValueTask)));
Console.WriteLine("6:" + typeof(ValueTask<int>).IsAssignableFrom(typeof(ValueTask)));
Console.WriteLine("7:" + typeof(ValueTask<>).IsAssignableFrom(typeof(ValueTask<>)));
Console.WriteLine("8:" + typeof(ValueTask<int>).IsAssignableFrom(typeof(ValueTask<int>)));
Console.WriteLine("9:" + typeof(ValueTask<>).IsAssignableFrom(typeof(ValueTask<int>)));
Console.WriteLine("10:" + typeof(ValueTask<int>).IsAssignableFrom(typeof(ValueTask<>)));
Console.WriteLine("11:" + typeof(ValueTask<int>).IsGenericType);
Console.WriteLine("12:" + typeof(ValueTask<int>).BaseType);
Console.WriteLine("13:" + typeof(ValueTask<int>).Name);
Console.WriteLine("14:" + ValueTaskMethod().Result);
Console.WriteLine("15:" + ValueTaskAsyncMethod().Result);
}
public static ValueTask<int> ValueTaskMethod()
{
return new ValueTask<int>(10);
}
public static async ValueTask<int> ValueTaskAsyncMethod()
{
await Task.Delay(100).ConfigureAwait(false);
return 10;
}
}
1:False
2:False
3:True
4:True
5:False
6:False
7:True
8:True
9:False
10:False
11:True
12:System.ValueType
13:ValueTask`1
14:10
15:10

检查type.IsGenericType,如果是,只需尝试在特定类型上调用GetGenericTypeDefinition()

Console.WriteLine("A:"+ typeof(ValueTask<>).GetGenericTypeDefinition());
Console.WriteLine("B:"+ typeof(ValueTask<int>).GetGenericTypeDefinition());
Console.WriteLine("C:"+ (typeof(ValueTask<int>).GetGenericTypeDefinition() == typeof(ValueTask<>)));
Console.WriteLine("D:"+ (typeof(ValueTask<>).GetGenericTypeDefinition() == typeof(ValueTask<>)));
Console.WriteLine("E:"+ (typeof(ValueTask<int>).GetGenericTypeDefinition() == typeof(ValueTask)));
Console.WriteLine("F:"+ (typeof(ValueTask<>).GetGenericTypeDefinition() == typeof(ValueTask)));
A:System.Threading.Tasks.ValueTask`1[TResult]
B:System.Threading.Tasks.ValueTask`1[TResult]
C:True
D:True
E:False
F:False

检查fiddle fork。请记住,在调用GetGenericTypeDefinition之前,您需要进行type.IsGenericType检查,否则您将在非泛型类型上获得异常!

最新更新