C# Ссылка на тип переменной, имя и значение в строке формата - PullRequest
1 голос
/ 17 февраля 2020

У меня есть эта проблема с некоторым кодом, который генерирует код SQL для последующей передачи через базу данных. Но пока я работал над кодом, я подумал: «Должен быть лучший способ сделать это»

Вот код, который я получил до сих пор:

if (invoice.ID is string) SQL.AppendFormat($"{nameof(invoice.ID)} = '{invoice.ID}'").Replace(",", ".").Append(", ");
else SQL.AppendFormat($"{nameof(invoice.ID)} = {invoice.ID}").Replace(",", ".").Append(", ");

if (invoice.InvoiceID is string) SQL.AppendFormat($"{nameof(invoice.InvoiceID)} = {invoice.InvoiceID}, ").Replace(",", ".").Append(", "); 
else SQL.AppendFormat($"{nameof(invoice.InvoiceID)} = {invoice.InvoiceID}").Replace(",", ".").Append(", ");

if (invoice.IssuedDate is string) SQL.AppendFormat($"{nameof(invoice.IssuedDate)} = {invoice.IssuedDate}, ").Replace(",", ".").Append(", "); 
else SQL.AppendFormat($"{nameof(invoice.IssuedDate)} = {invoice.IssuedDate}").Replace(",", ".").Append(", ");

Как вы можете видеть, я должен ссылаться на переменную каждый раз, и я хочу, чтобы этот код был как можно более динамичным c, так как я еще не знаю, сколько столбцов будет, когда я закончу.

Так что мой wi sh должен иметь возможность копировать и вставлять некоторый код и изменять только одну или, может быть, две переменные (предпочтительно одну), например:

if ({0} is string) SQL.AppendFormat($"{nameof({0})} = '{{0}}'").Replace(",", ".").Append(", ");
else SQL.AppendFormat($"{nameof({0})} = {{0}}").Replace(",", ".").Append(", ").Format(invoice.ID);

Я знаю приведенный выше пример невозможен, но я надеюсь, что вы видите, что я хочу.

Заранее большое спасибо, и любая помощь будет высоко оценена

1 Ответ

0 голосов
/ 17 февраля 2020

Помимо комментариев Мар c Грэвелла, вы могли бы получить что-то вроде этого:

    public class SomeInvoiceData
    {
            public int InvoiceID { get; set; }
            public System.DateTime InvoiceDate { get; set; }
            public string InvoiceName { get; set; }
    }

    public static class Value
    {
            public static string Formatted(this object o) 
            {
                    if (o is string)
                    {
                            return $"'{o.ToString()}'";
                    }
                    else if(o is DateTime)
                    {
                            return $"'{o.ToString()}'";
                    }
                    else
                    {
                            return $"{o.ToString()}";
                    }
            }
    }


    public class SQLBuilder
    {
            private List<string> List = new List<string>();
            private string Delimiter = ",";
            public void AppendAll(object instance)
            {
                    System.Reflection.PropertyInfo[] listProperty = instance.GetType().GetProperties();
                    foreach (var property in listProperty)
                    {
                            var pvalue = property.GetValue(instance);
                            var statement = $"{property.Name} = {pvalue.Formatted()}";
                            List.Add(statement);
                    }
            }
            public string Get()
            {
                    return String.Join(Delimiter, List);
            }
    }

результат равен InvoiceID = 123, InvoiceDate = '17.02.2020 10:23:04' , InvoiceName = 'Счет за $ 3,3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...