C # строка интерполяции в статическом контексте - PullRequest
0 голосов
/ 22 октября 2018

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

Давайте посмотрим на мой код, яиспользую статическую строку:

    public class NewHumanSource
    {
            static readonly string template =
                "internal class {ClassName} : IHuman " + 
                "{ " +
                     // bunch of private fields here;
                     "private int age; " + Environment.NewLine +

                     "public int Age" + Environment.NewLine +
                     "{" + Environment.NewLine +
                          "get =>" + $"{int.Parse("{Age}")}" + ";" + Environment.NewLine +
                          "set" + Environment.NewLine +
                          "{" + Environment.NewLine +
                               "age= value;" + Environment.NewLine +
                               "OnPropertyChanged(nameof(age));" +Environment.NewLine +      
                          "}" + Environment.NewLine +
                     "}" + Environment.NewLine + Environment.NewLine +

                      // Other properties and members
                ";"

Статический член, который используется для установки значений в шаблоне исходного кода:

 public static string GetSourceCode(IHuman newHuman, string className)
 {
     code = code.Replace("{ClassName}", className.ToLowerInvariant().Replace(" ", ""));
     code = code.Replace("{Age}", newHuman.Age.ToString()); //Age is an integer.
     //...
 }

Затем вызывается из внешнего класса:

 var code = NewHumanSource.GetSourceCode(newHuman, className);

В этой строке выдается исключение.Статический метод даже не загружается:

System.TypeInitializationException: 'The type initializer for 'DynamicCompilerTest.Classes.DynamicCompiler.NewHumanSource' threw an exception.'

InnerException  {"Input string was not in a correct format."}   System.Exception {System.FormatException}

Он бы работал нормально, если бы все свойства были строками, но эта интерполяция строк вызывает исключение:

 "get =>" + $"{int.Parse("{Age}")}" + ";" +

Любое представление окак я должен обрабатывать не строковый тип?Мне нужно обрабатывать встроенный тип, как DateTime и тому подобное.Или есть даже более элегантный способ создать класс в виде текста со значениями свойств?Я мог бы получить удовольствие от форматирования.

Большое спасибо за вашу помощь / советы!

1 Ответ

0 голосов
/ 22 октября 2018

Это не будет работать таким образом.int.Parse("{Age}") будет оцениваться во время инициализации типа, и поэтому он не может использовать Age.Исходя из вашего кода, я считаю, что вам просто нужно заменить его на return age.

Вы также можете воспользоваться многострочным строковым литералом:

static readonly string template =
    @"internal class {ClassName} : IHuman 
      {
          // bunch of private fields here
          private int age = {Age};

          public int Age
          {
              get { return age; }
              set
              {
                  age = value;
                  OnPropertyChanged(nameof(Age));
              }
          }

          // Other properties and members
      }";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...