如何使用Roslyn在C#中获得类型的lambda?
我正在用罗斯林(Roslyn)编写我的代码缀合物。我希望它以这种方式工作:
以前:
IEnumerable<int> list = new List<int> {1, 2, 3, 4};
list = list.Where(x => x%2 == 0);
问题:
...
IEnumerable<int> list = new List<int> {1, 2, 3, 4};
list = list.Where(lambdaMethod);
...
private static bool lamdaMethod(int x)
{
return x % 2 == 0;
}
问题是我找不到适当的方法和参数类型的返回类型。
我从分析仪模板中的方法:
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
// TODO: Replace the following code with your own analysis, generating a CodeAction for each fix to suggest
var diagnostic = context.Diagnostics.FirstOrDefault();
var diagnosticSpan = diagnostic.Location.SourceSpan;
// Find the type declaration identified by the diagnostic.
var declaration = root.FindToken(diagnosticSpan.Start).Parent.AncestorsAndSelf()
.OfType<LambdaExpressionSyntax>().FirstOrDefault();
if (declaration == null)
return;
// Register a code action that will invoke the fix.
context.RegisterCodeFix(
CodeAction.Create(
title: $"{"Just Title"}",
createChangedDocument: c => MakeLambdaOptimization(context.Document, declaration, c),
equivalenceKey: nameof(CodeFixResources.CodeFixTitle)),
diagnostic);
}
如您所见,我正在使用lambdaexpressionsyntax
。还有SimpleLambdaexpressyNtax
和括号>括号>括号lambdaexpressionsyntax
,可以帮助我获得parametersyntax
。在parametersyntax
中,我可以找到type
,但它是null,我得到了NullReferenceException。
我试图获得全部类型的lambda(例如func&lt; int,bool&gt;
),我想这对我有帮助。我该怎么做?我听说过semanticmodel,但我不知道如何使用它
I'm writing my codefixer with roslyn. I want it to work in such way:
Before:
IEnumerable<int> list = new List<int> {1, 2, 3, 4};
list = list.Where(x => x%2 == 0);
After:
...
IEnumerable<int> list = new List<int> {1, 2, 3, 4};
list = list.Where(lambdaMethod);
...
private static bool lamdaMethod(int x)
{
return x % 2 == 0;
}
The problem is that I can't find the proper way to get return type for the method and type of argument.
My method from analyzer template:
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);
// TODO: Replace the following code with your own analysis, generating a CodeAction for each fix to suggest
var diagnostic = context.Diagnostics.FirstOrDefault();
var diagnosticSpan = diagnostic.Location.SourceSpan;
// Find the type declaration identified by the diagnostic.
var declaration = root.FindToken(diagnosticSpan.Start).Parent.AncestorsAndSelf()
.OfType<LambdaExpressionSyntax>().FirstOrDefault();
if (declaration == null)
return;
// Register a code action that will invoke the fix.
context.RegisterCodeFix(
CodeAction.Create(
title: quot;{"Just Title"}",
createChangedDocument: c => MakeLambdaOptimization(context.Document, declaration, c),
equivalenceKey: nameof(CodeFixResources.CodeFixTitle)),
diagnostic);
}
As you see, I'm working with LambdaExpressionSyntax
. There are also SimpleLambdaExpressionSyntax
and ParenthesizedLambdaExpressionSyntax
which help me to get ParameterSyntax
. In the ParameterSyntax
I can find Type
, but it's null and I get NullReferenceException.
I tried to get the whole type of lambda (e.g. Func<int, bool>
), I guess it would help me. How can I do it? I've heard about SemanticModel, but I don't know how to use it
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用
SemanticModel.GetSymbolInfo(ExpressionSyntax)
获取 lambda 符号。从 lambda 符号中您可以找到所需的信息(返回类型和参数类型)。这是一个代码片段(为了简单起见,在控制台应用程序而不是代码修复程序的上下文中编写 - 您将能够使其适用于代码修复程序):You can use
SemanticModel.GetSymbolInfo(ExpressionSyntax)
to get the lambda symbol. From the lambda symbol you can find the information you need (return type and parameter types). Here is a code snippet (written in the context of a Console Application instead of a codefix for simplicity - you'll be able to get it working for codefixes):