我使用以下linq来解析我返回的数据集:
row.Field<long?>("id").HasValue == false &&
我遇到的问题是,当从Sql Server获取数据集时,该字段需要使用<int?>
进行解析,当从Oracle获取时,需要将其解析为{{1} }。有没有办法创建一个变量,我可以传入.Field方法来动态设置这种数据类型?我想要这样的东西:
<long?>
提前致谢!
答案 0 :(得分:3)
您可以使用反射(不推荐)或只使用三元运算符:
!(IsSqlServer ? row.Field<int?>("id").HasValue : row.Field<long?>("id").HasValue)
答案 1 :(得分:1)
这是一个扩展方法:
public static class DataRowHelpers
{
private static readonly Dictionary<Type, MethodInfo> FieldSpecialized = new Dictionary<Type, MethodInfo>();
public static bool FieldHasValue(this DataRow row, Type type, string column)
{
MethodInfo fieldSpecialized;
if(!FieldSpecialized.TryGetValue(type, out fieldSpecialized))
{
var extensions = typeof(DataRowExtensions);
var fieldGeneric = extensions.GetMethod("Field",
new[] { typeof(DataRow), typeof(string) });
fieldSpecialized = fieldGeneric.MakeGenericMethod(type);
FieldSpecialized.Add(type, fieldSpecialized);
}
return fieldSpecialized.Invoke(null, new object[] { row, column }) != null;
}
}
用法:
var type = IsSqlServer ? typeof(int?) : typeof(long?);
var predicate = row.FieldHasValue(type, "id");
答案 2 :(得分:1)
您可以将dynamic
关键字用于此目的。有关编程指南,请参阅here。
我希望这会有所帮助。