Как получить ожидаемый тип в выражении, используя Roslyn? - PullRequest
1 голос
/ 11 января 2020

Я хочу разработать кодовое исправление для CS0417 и застрял при поиске, как определить тип, необходимый для исправления ошибки разрешения перегрузки.

Глядя на источники , кажется, что код, необходимый для определения того, какой тип требуется, является внутренним в настоящее время. Кто-нибудь знает встроенный способ выяснить, что "строка" ожидается в следующем коде?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class TypeName
    {
        TypeName()
        {
            var action = new Func<int, string>(TestMethod);
        }

        private int TestMethod(int arg)
        {
            throw new NotImplementedException();
        }
    }
}

Вы можете потянуть эту ветвь и отладить тестовый метод Cs0407FixGenerateFixedReturn для начать быстро.

1 Ответ

1 голос
/ 12 января 2020

Решение довольно простое, если тип является делегатом, что соответствует моим потребностям:

            var creationSyntax = argumentSyntax.AncestorsAndSelf().OfType<ObjectCreationExpressionSyntax>().FirstOrDefault();
            if (creationSyntax == null)
                return false;

            var symbolInfo = semanticModel.GetSymbolInfo(creationSyntax.Type).Symbol;
            if (symbolInfo is INamedTypeSymbol namedType)
            {
                symbol = namedType?.DelegateInvokeMethod?.ReturnType;
                return symbol != null;
            }
...