Я пытаюсь создать класс для представления значения столбца в SQL. Вот конечная цель, которую я хочу достичь:
public string GenerateInsertSql()
{
StringBuilder insertSql = new StringBuilder();
insertSql.Append("INSERT INTO " + SchemaName + "." + TableName + "\n");
insertSql.Append("(\n");
int counter = 0;
foreach (ColumnValue columnValue in _insertValues)
{
if (counter > 0) insertSql.Append(",");
counter++;
insertSql.Append(columnValue.ColumnName).Append("\n");
}
insertSql.Append(")\n");
insertSql.Append("VALUES\n");
insertSql.Append("(\n");
counter = 0;
foreach (ColumnValue columnValue in _insertValues)
{
if (counter > 0) insertSql.Append(",");
counter++;
insertSql.Append(columnValue.SqlValue).Append("\n");
}
insertSql.Append(")\n");
}
Итак, класс - это класс ColumnValue
, упомянутый выше. Класс ColumnValue
нуждается в свойстве Value
, которое предположительно может быть любого базового типа .NET (int, string и т. Д.). Класс также имеет свойство SqlValue
, которое предоставляет строковое представление свойства Value
, которое я могу использовать в сгенерированном операторе SQL. Так что если Value
является целым числом, то SqlValue
просто дает Value.ToString()
, тогда как если Value
является строкой, SqlValue
необходимо проверить, является ли строка нулевой, чтобы либо возвратить NULL, либо 1014 * собственно свойство.
Изначально я пытался использовать Value
в качестве объекта и SqlValue
для проверки типа Value
в операторе switch:
public string SqlValue
{
get
{
switch (Value.GetType())
{
...
}
}
}
Но тогда я получаю «Ожидаемое значение целого типа». Поэтому я не могу проверить тип объекта.
Затем я попробовал дженерики. Я изменил класс ColumnValue
на ColumnValue<T>
со свойством Value
следующим образом:
public T Value { get; set; }
А затем, в свойстве SqlValue
, еще одна проверка типа T, но я тоже не могу этого делать.
Есть ли способ достичь этого в C # без простого создания отдельных классов для обработки каждого возможного типа столбца?