簡體   English   中英

如何在C#中創建包含各種類型的屬性的類

[英]How to create class containing property of various types in C#

我正在嘗試創建一個類來表示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是一個int類型,則SqlValue僅給出Value.ToString() ,而如果Value是一個字符串,則SqlValue需要檢查該字符串是否為null以便返回'NULL'或Value屬性本身。

最初,我嘗試將Value作為對象,並使用SqlValue在switch語句中測試Value的類型:

public string SqlValue
{
  get
  {
    switch (Value.GetType())
    {
      ...
    }
  }
}

但是然后我得到“期望整數類型的值”。 因此,我無法檢查對象的類型。

接下來,我嘗試了泛型。 我將ColumnValue類更改為ColumnValue<T> ,其Value屬性如下:

public T Value { get; set; }

然后,在SqlValue屬性中,再次檢查T的類型,但我也不允許這樣做。

有沒有一種方法可以在C#中實現而無需簡單地創建單獨的類來處理每種可能的列類型?

switch關鍵字只能使用整數(正確地說是整數類型(請參見此處 ))。 但是您始終可以使用“ if”語句。 例如,

var t = value.GetType();
if (t == typeof(string))
{
   ..
}
else if (t == typeof(int))
{
}
else if ...

您也可以使用“ is”關鍵字。 例如,

if (value is string) 
{
  ...
}
else if (value is int)
{
  ...
}
else if ...

“ is”運算符還將在繼承層次結構中進行檢查,但我認為您的用法並非如此。

最后,我希望您要執行的任何SqlValue實現都可以處理轉義(例如-字符串值內的引號),並且可以防止sql注入攻擊。 您可以考慮生成參數化的查詢insetad(即為查詢中的每一列添加參數,然后將實際值作為參數值傳遞-這樣就根本不需要SqlValue屬性)。

如果使用參數,則可以讓SqlValue僅返回一個對象。

您的示例將需要在字符串周圍添加引號,並處理區域性問題(雙精度格式,日期格式)。

您還可以使用Type.GetTypeCode(Value.GetType()),將其轉換為枚舉TypeCode,該枚舉具有從數據庫中檢索的所有原始值(特別是枚舉的值)。 除了Guid會作為對象出現,但您可以在對象塊中處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM