搜索通用任务<T>表达式的更好方法

问题描述 投票:0回答:1

我使用的是 roslyn 分析器,它可以处理

async Task<T>
对对象变量的装箱,例如:

int GetValue() => ...

void Print(object value) => Console.WriteLine(value);

void Main() {
  Print(GetValue());
}

如果你改变:

-int GetValue() => ...
+Task<int> GetValue() => ...

分析仪应该发出警告。

我实际上已经处于编码的最后阶段,只想在某个位置优化我的代码:

我有一个

IsGenericTaskType
方法,转移到它的
ITypeSymbol
被分析为
System.Threading.Tasks.Task'1
,但通过字符串比较我实际上不喜欢。

ChatGPT 答案:

type as INamedTypeSymbol)?.ConstructedFrom.SpecialType == SpecialType.System_Threading_Tasks_Task_T;

但是由于 CS1061 我无法访问

SpecialType.System_Threading_Tasks_Task_T
..

有没有可能的方法来比较我的类型符号而不使用字符串?

c# .net roslyn vsix roslyn-code-analysis
1个回答
0
投票

您可以使用

.editorconfig
,而不是为此编写分析器:https://stackoverflow.com/a/53973220/9080566

如果您无论如何都想要一个分析器,我建议只查看该方法是否使用

async
关键字声明,并完全忽略返回类型。 (也许只是跳过
async void
方法。)C# 中的异步方法可以返回符合编译器识别模式的任何类型,例如
ValueTask<T>

通过字符串比较我实际上不喜欢。

如果您确实想检查

Task<T>
,字符串比较似乎是最好的选择 - 它速度很快,并且您希望分析器能够这样做。这个官方的 VS 分析器也使用字符串比较:referencedefinition

typeSymbol.Name == nameof(Task) && typeSymbol.BelongsToNamespace(Namespaces.SystemThreadingTasks)
© www.soinside.com 2019 - 2024. All rights reserved.