首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用反射检测泛型值任务类型ValueTask<T>

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

Stack Overflow用户
提问于 2020-04-19 20:49:35
回答 1查看 124关注 0票数 0

我试图找到一个Type或方法,用它可以确定我们正在处理的是一个通用的ValueTask。

我测试了一些选项,但只有Name属性似乎是指示性的--泛型值任务以字符串“ValueTask`”开头:

https://dotnetfiddle.net/drzlrn

代码语言:javascript
运行
复制
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;
    }
}
代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-20 01:54:42

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

代码语言:javascript
运行
复制
        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)));
代码语言:javascript
运行
复制
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检查,否则将得到非泛型类型的异常!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61311463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档