如何查找和添加缺少的代码

时间:2019-01-12 18:38:30

标签: c# roslyn

我尝试找出缺少的Uses。基于Roslyn编译器的响应,我想以编程方式添加缺少的使用。例如:

(91,13): error CS0103: The name "thread" does not exist in the current context.
(76,35): error CS0103: The name "SmoothingMode" does not exist in the current context.

因此,作为一名程序员,我知道缺少的用途是:

using System.Threading;
using System.Drawing.Drawing2D;

但是我该如何以编程方式解决编译器问题?

罗斯林有办法提供帮助吗?

还是可以接管Visual Studio解决方案?

enter image description here

1 个答案:

答案 0 :(得分:1)

检查反射后,找到了解决此特定问题的方法。我知道这很不好,但是它现在可以使用,也许有人可以重用它。

基于Roslyn编译器的错误消息:

(18,27): error CS0103: Der Name \"Environment\" ist im aktuellen Kontext nicht vorhanden.
(33,30): error CS0103: Der Name \"DateTime\" ist im aktuellen Kontext nicht vorhanden.
(50,13): error CS0103: Der Name \"Thread\" ist im aktuellen Kontext nicht vorhanden.

我隔离了问题类型:

 List<string> errorList = new List<string>();
     foreach (string error in compiler.LastError)
         if (error.Contains("CS0103:"))
             errorList.Add(error.Split(new string[] { "\"" }, StringSplitOptions.None)[1]);

在我的errorList中填充了{“ Environment”,“ DateTime”,“ Thread”}之后,我尝试通过反射在我的程序集中找到这些类型。

我检查了所有172个项目程序集后,发现可以在mscorlib.dll中找到所需的所有内容。 C#专家知道原因。

因此,加载.dll并查找类型:

//LOAD MSCORLIB.DLL ASSEMBLY
var assembly = Assembly.Load("mscorlib.dll");

//GET MSCORLIB.DLL TYPES
Type[] types = assembly.GetTypes();

foreach (string error in errorList)
    foreach (Type type in types)

    if (type.Name == error)
    {
        System.Console.WriteLine("using " + type.FullName.Substring(0, type.FullName.Length - (error.Length + 1)) + ";");
        break;
    }

输出将是:

//MISSING USINGS
using System;
using System;
using System.Threading;

我知道这不适用于复杂的项目,但是对于我的问题来说这已经足够了,也许对其他人也是如此。