1

我正在使用以下 linq 解析我返回的数据集:

 row.Field<long?>("id").HasValue == false &&

我遇到的问题是,当从 Sql Server 获取数据集时,需要解析该字段,<int?>从 Oracle 获取时,需要将其解析为<long?>. 有没有办法创建一个变量,我可以传递给 .Field 方法来动态设置这个数据类型?我想要这样的东西:

Type T = IsSqlServer ? typeof(int?) : typeof(long?);
....
row.Field<T>("id").HasValue == false &&

提前致谢!

4

3 回答 3

3

您可以使用反射(不推荐)或只使用三元运算符:

!(IsSqlServer ? row.Field<int?>("id").HasValue : row.Field<long?>("id").HasValue)
于 2013-08-06T13:58:09.523 回答
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");
于 2013-08-06T14:17:41.707 回答
1

您可以dynamic为此目的使用关键字。有关编程指南,请参见此处

我希望这有帮助。

于 2013-08-06T17:46:57.160 回答