我试图找到一个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发布于 2020-04-20 01:54:42
检查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检查小提琴叉。请记住,在调用type.IsGenericType之前需要进行GetGenericTypeDefinition检查,否则将得到非泛型类型的异常!
https://stackoverflow.com/questions/61311463
复制相似问题