J'ai ce problème avec du code qui génère du code SQL, pour passer plus tard dans une base de données. Mais pendant que je travaillais sur le code, je me suis dit "Il doit y avoir une meilleure façon de faire ça"

Voici le code que j'ai pour l'instant :

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(", ");

Comme vous pouvez le voir, je dois référencer la variable à chaque fois, et je veux que ce code soit aussi dynamique que possible, car je ne sais pas encore combien de colonnes il y aura quand j'aurai fini.

Mon souhait est donc de pouvoir copier et coller du code et de ne modifier qu'une ou peut-être deux variables (de préférence une) comme ceci :

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

Je sais que l'exemple ci-dessus n'est pas possible, mais j'espère que vous pouvez voir ce que je veux.

Un grand merci d'avance, et toute aide est grandement appréciée

1
Choppa dude 17 févr. 2020 à 15:31

1 réponse

Meilleure réponse

En dehors des commentaires de Marc Gravell, vous pourriez avoir quelque chose du genre :

    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);
            }
    }

Le résultat est InvoiceID = 123,InvoiceDate = '17/02/2020 10:23:04 AM',InvoiceName = 'facture pour 3,3 $'

0
yob 17 févr. 2020 à 15:25