从文本运行时编译类时使用ValueTuple

时间:2018-06-28 13:21:11

标签: c# codedom valuetuple

我正在尝试在运行时从文本编译一个类。我的问题是我的班级在函数(AllLines)中使用valueTupe,并且收到错误“ C:\ xxxx.cs(19,28):错误CS0570:该语言不支持'BaseClass.AllLines'”使用此代码

CodeDomProvider objCodeCompiler = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();

CompilerParameters objCompilerParameters = new CompilerParameters();

objCompilerParameters.ReferencedAssemblies.Add("mscorlib.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.IO.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Linq.dll");
CompilerResults objCompileResults = objCodeCompiler.CompileAssemblyFromFile(objCompilerParameters, filename);

编辑:

文本文件如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
namespace MyNamespace
{
    public abstract class BaseClass
    {
        public List<(int LineNumber, string Value)> AllLines
        {
            ...
        }
    }
}

我正在使用Microsoft.CodeDom.Providers.DotNetCompilerPlatform v2.0.0.0, Microsoft(R)Visual C#编译器版本1.0.0.50618

不确定这是否是roslyn的实际版本。

2 个答案:

答案 0 :(得分:0)

我认为是因为您忘记了方法AllLines()之后的括号:-)

答案 1 :(得分:0)

首先,您正确地使用了Roslyn,就像使用NuGet软件包Microsoft.CodeDom.Providers.DotNetCompilerPlatform中的Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider一样。

但是,您面临的问题是您的文本文件不包含有效的C#。

  1. 您的List<T>声明在将类型参数括在括号中无效
  2. 您要在类型参数声明(LineNumber,Value)中添加名称(?)。
  3. List<T>仅接受一个类型参数时,您将提供两个类型参数。 (也许您打算使用Dictionary<TKey, TValue>
  4. 您的财产声明没有任何内容

尝试将您的文本文件替换为:

using System;
using System.Collections.Generic;
using System.Linq;
namespace MyNamespace
{
    public abstract class BaseClass
    {
        public Dictionary<int, string> AllLines
        {
            get; set;
        }
    }
}

请注意,此示例实际上不需要using Systemusing System.Linq。另请注意,您无需为此使用Roslyn。老式的CodeDOM可以对其进行编译(将Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider替换为Microsoft.CSharp.CSharpCodeProvider)。