Моя цель - реализовать метод Foo
такой, чтобы:
typeof(int) == Foo("1 + 1")
или
typeof(List<int>) == Foo("new List<int>()")
Важно, чтобы выражение в строке не выполнялось, поэтому я пытаясь использовать Roslyn для достижения этой цели. Пока что у меня есть:
public Type Foo(string inputString)
{
var syntaxTree = CSharpSyntaxTree.ParseText($"var x = {inputString};");
var compilation = CSharpCompilation.Create("Test").AddSyntaxTrees(syntaxTree);
var semanticModel = compilation.GetSemanticModel(syntaxTree);
var typeInfo = semanticModel.GetTypeInfo(SyntaxFactory.ParseExpression(inputString));
return typeof(string);
}
Теперь эта функция, очевидно, не делает ничего полезного в настоящее время, потому что она не работает. Я получаю исключение "Syntax node is not within syntax tree"
. Я пробовал другие (довольно страшные) итерации, в том числе:
var typeInfo = _semanticModel.GetTypeInfo(((FieldDeclarationSyntax)((CompilationUnitSyntax)syntaxTree.GetRoot()).Members.First()).Declaration.Variables.First().Initializer.Value);
, который хотя бы выполнялся, но я не могу получить какой-либо фактический TypeInfo
от метода GetTypeInfo
...
Теперь, даже если мне это удалось, я не уверен, что я могу сделать с TypeInfo
; может превратить его в Type
или нет?
Так что по сути вопрос сводится к следующему: возможно ли получить Type
из строки? Если это так, то я смутно иду в правильном направлении?