代码之家  ›  专栏  ›  技术社区  ›  David

如何在C中创建包含各种类型属性的类#

  •  0
  • David  · 技术社区  · 14 年前

    我正在尝试创建一个类来表示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 上述类别。这个 柱值 类需要A Value 属性,它可能是任何基本.NET类型(int、string等)。类也有一个属性, SqlValue ,它提供了 价值 我可以在生成的SQL语句中使用的属性。所以如果 价值 是int,那么 平方值 只要给出 Value.ToString() 而如果 价值 是一个字符串, 平方值 需要检查字符串是否为空,以便返回“null”或 价值 属性本身。

    最初我试着 价值 作为一个对象和 平方值 测试 价值 在switch语句中:

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

    但我得到了“期望的整型值”。所以我不能检查对象的类型。

    接下来我尝试了仿制药。我改变了 柱值 类到 ColumnValue<T> 价值 属性如下:

    public T Value { get; set; }
    

    然后,在 平方值 属性,对t类型的另一个检查,但我也不允许这样做。

    有没有一种方法可以在C中实现这一点,而不需要简单地创建单独的类来处理每种可能的列类型?

    3 回复  |  直到 14 年前
        1
  •  0
  •   VinayC    14 年前

    switch关键字只能取整数(正确地说,是整数类型(请参见 here )但是,您可以始终使用“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属性)。

        2
  •  0
  •   Hans Kesting    14 年前

    如果使用参数,可以让sqlValue返回一个对象。

    您的示例需要在字符串周围添加引号,并处理区域性问题(double的格式、日期)。

        3
  •  0
  •   Michael B    14 年前

    您还可以使用type.gettypecode(value.gettype()),它将把它转换为枚举类型代码,该代码具有从数据库中检索的所有基元值,尤其是枚举的基元值。除了将作为对象出现的guid之外,您可以在对象块中处理它。