在源代码中使用Foreach文件进行编译时填充字典?

时间:2018-11-08 20:28:40

标签: c# compilation

好的,所以这可能不可能,但是我想知道是否可以创建像这样的字典:

public static class TableList
{
    public static Dictionary<string, JObject> Tables = new Dictionary<string, JObject>();
    public static JObject GetTable(string ReturnTable)
    {
        Tables = new Dictionary<string, JObject>();
        string[] files = Directory.GetFiles(FolderPath, "*.cs");
        foreach (string FileName in files)
        {
            string FormattedFilename = FileName;
            FormattedFilename = System.IO.Path.GetFileNameWithoutExtension(FormattedFilename);
            FormattedFilename = char.ToUpper(FormattedFilename[0]) + FormattedFilename.Substring(1);
            Tables.Add(FileName, TableDefinitions.FormattedFilename.TableDef());

        }

        if (Tables.ContainsKey(ReturnTable))
        {
            return Tables[ReturnTable];

        }
        else
        {
            return TableDefinitions.GenericTable.TableDef(ReturnTable);

        }
    }
}

我在源代码的一个目录中有很多配置文件(超过100个),唯一缺少的是使它们自动工作的方法是:

Tables.Add(file, TableDefinitions.File.TableDef());

我可以手动完成每一行,但是我喜欢在可能的情况下实现自动化。

1 个答案:

答案 0 :(得分:1)

我假设您要在编译时查看目录,然后根据该目录创建代码。

您可以在编译之前使用“设计时T4”文本模板来创建代码。

https://docs.microsoft.com/en-us/visualstudio/modeling/code-generation-and-t4-text-templates?view=vs-2017#design-time-t4-text-templates

编辑

我以前没有弄过这些模板,所以我想对您的特定问题大加赞赏。

在您的.tt文件中,您可以使用以下代码:

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>

using System.Windows.Forms;
using System.Collections.Generic;

namespace Sandbox
{
    public class TestClass
    {
      public static List<string> GetFiles()
      {
          List<string> filenames = new List<string>();
          <#
          string path = @"C:\Test";
          foreach (var x in Directory.GetFiles(path))
          {#>
            filenames.Add(@"<#=x#>");
          <#}#>
          return filenames;

      }
    }
}

这将在.cs文件中生成以下输出:

使用System.Windows.Forms; 使用System.Collections.Generic;

  namespace Sandbox
  {
    public class TestClass
    {
      public static List<string> GetFiles()
      {
          List<string> filenames = new List<string>();
          filenames.Add(@"C:\Test\A.txt");
          filenames.Add(@"C:\Test\B.txt");
          return filenames;
      }
    }
  }

然后您可以从主代码中调用它:

var fileList = Sandbox.TestClass.GetFiles();