Заполнить словарь во время компиляции с файлом Foreach в источнике? - PullRequest
0 голосов
/ 08 ноября 2018

Хорошо, возможно, это невозможно, но мне интересно, возможно ли создать словарь, подобный этому:

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 голосов
/ 09 ноября 2018

Я предполагаю, что вы хотите посмотреть каталог во время компиляции, а затем создать код на его основе.

Вы можете использовать текстовые шаблоны Design time T4 для создания кода непосредственно перед компиляцией.

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

EDIT

Раньше я не сталкивался с этими шаблонами, поэтому решил, что смогу разобраться с вашей конкретной проблемой.

В вашем файле .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; using 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...