Есть ли способ указать класс, имея его тип? - PullRequest
2 голосов
/ 23 апреля 2019

Есть одна проблема. OracleDataReader может сообщить о столбце name, type и value по типу.

int i = № of column 
string name = reader.GetName(i)
Type fieldType = reader.GetFieldType(i)
reader.GetFieldValue<T>(i)

Метод GetFieldType возвращает поле Type.

Например:

Type fieldType = reader.GetFieldType(i)
fieldType.name = System.String

В методе GetFieldValue<T> вместо T я указываю класс String like ...

string result = reader.GetFieldValue<string>(i);

Ниже приведен раздел кода, в котором я перебираю TypeCode.

Есть ли способ указать класс, указав его тип?

var result = reader.GetFieldValue<fieldType.class>(i);

using (OracleDataReader reader = cmd.ExecuteReader()) {
      while (reader.Read()) {
        int count = reader.FieldCount;
        string[] rows = new string[count];

        for (int i = 0; i < count; i++) {
          rows[i] = String.Format(@"""{0}"":", reader.GetName(i));
          Type fieldType = reader.GetFieldType(i);

          if (reader.IsDBNull(i)) {
            DBNull nullValue = reader.GetFieldValue<DBNull>(i);
            rows[i] += SerializeOracleValue(nullValue);
          } else {
            switch (Type.GetTypeCode(fieldType)) {
              case TypeCode.Boolean:
                bool boolValue = reader.GetFieldValue<bool>(i);
                rows[i] += SerializeOracleValue(boolValue);
                break;
              case TypeCode.DBNull:
                DBNull nullValue = reader.GetFieldValue<DBNull>(i);
                rows[i] += SerializeOracleValue(nullValue);
                break;
              case TypeCode.Int32:
                int intValue = reader.GetFieldValue<int>(i);
                rows[i] += SerializeOracleValue(intValue);
                break;
              case TypeCode.Decimal:
                decimal decValue = reader.GetFieldValue<decimal>(i);
                rows[i] += SerializeOracleValue(decValue);
                break;
              case TypeCode.DateTime:
                DateTime dateValue = reader.GetFieldValue<DateTime>(i);
                rows[i] += SerializeOracleValue(new DateTimeOffset(dateValue));
                break;
              case TypeCode.String:
                string stringValue = reader.GetFieldValue<string>(i);
                rows[i] += SerializeOracleValue(stringValue);
                break;
              default:
                break;
            }
          }
        }
        Console.Out.WriteLine($"{{{String.Join(",", rows)}}}");
      }
      Console.Out.WriteLine("Empty");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...