C# 有没有办法通过指定类的类型来指定类?
有一个问题C# 有没有办法通过指定类的类型来指定类?,c#,oracle,asp.net-core,C#,Oracle,Asp.net Core,有一个问题OracleDataReader可以按类型报告列名称、类型、和值 int i = № of column string name = reader.GetName(i) Type fieldType = reader.GetFieldType(i) reader.GetFieldValue<T>(i) 在GetFieldValue方法中而不是T,我指定了类String,比如 string result = reader.GetFieldValue<string&g
OracleDataReader
可以按类型报告列名称
、类型
、和值
int i = № of column
string name = reader.GetName(i)
Type fieldType = reader.GetFieldType(i)
reader.GetFieldValue<T>(i)
在GetFieldValue
方法中而不是T
,我指定了类String
,比如
string result = reader.GetFieldValue<string>(i);
为什么要将所有这些值序列化为字符串数组?这可能就是您陷入这种类型混乱的原因。您似乎正在重新创建EntityFramework。为什么不直接用它呢?或者,如果您想要更轻量级的东西,请使用DavidG,我正在将数据库中的数据序列化为json字符串,以避免创建一堆dbo结构。默认情况下,Oracle 12.1中实现了此功能,但是我们有12.0如果
SerializeOracleValue
可以接受对象,那么读取器。GetFieldValue(i)
可能就足够了。泛型是一种编译时工具,所以它们在这里没有多大帮助。@Heinzi,它会起作用的。但是我首先获取对象,然后尝试解析它的字符串表示。如果我一开始就知道它的类型,并且可以用这种形式来选择它,那么为什么会发生这些事情呢。
string result = reader.GetFieldValue<string>(i);
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");
}