
public static Nullable<T> SafeRead<T>(DaTarow row,string fIEldname) where T : struct{ if (row.HasColumn(fIEldname)) { return row.FIEld<Nullable<T>>(fIEldname) ?? default(Nullable<T>); } else return default(Nullable<T>);}public static T SafeRead<T>(DaTarow row,string fIEldname) where T : class{ if (row.HasColumn(fIEldname)) { return row.FIEld<T>(fIEldname) ?? default(T); } else return default(T);} 但是这显然会引发方法模糊,因为C#不允许基于参数约束的方法重载
解决方法 以下内容将为您提供数据行中的值,如果值为dbnull.Value,则为类型的默认值.如果未定义该字段,则会抛出ArgumentException.using System;using System.Data;public static class DataAccess{ public static T GetValueOrDefault<T>(DaTarow row,string fIEldname) { if (!row.table.Columns.Contains(fIEldname)) { throw new ArgumentException( string.Format("The given DaTarow does not contain a fIEld with the name \"{0}\".",fIEldname)); } else if (row[fIEldname].Equals(dbnull.Value)) { return default(T); } return row.FIEld<T>(fIEldname); }} 以下是一些简单的测试:
[TestMethod]public voID GetValueOrDefault_ValueType_test(){ const string FIEldname = "Column"; const int Expected = 5; Datatable datatable = new Datatable(); datatable.Columns.Add(FIEldname,typeof(int)); DaTarow row = datatable.Rows.Add(Expected); int actual = DataAccess.GetValueOrDefault<int>(row,FIEldname); Assert.AreEqual(Expected,actual);}[TestMethod]public voID GetValueOrDefault_ValueType_dbnull_test(){ const string FIEldname = "Column"; Datatable datatable = new Datatable(); datatable.Columns.Add(FIEldname,typeof(int)); DaTarow row = datatable.Rows.Add(dbnull.Value); int actual = DataAccess.GetValueOrDefault<int>(row,FIEldname); Assert.AreEqual(default(int),actual);}[TestMethod]public voID GetValueOrDefault_ReferenceType_test(){ const string FIEldname = "Column"; object expected = new object(); Datatable datatable = new Datatable(); datatable.Columns.Add(FIEldname,typeof(object)); DaTarow row = datatable.Rows.Add(expected); object actual = DataAccess.GetValueOrDefault<object>(row,FIEldname); Assert.AreEqual(expected,actual);}[TestMethod]public voID GetValueOrDefault_ReferenceType_dbnull_test(){ const string FIEldname = "Column"; Datatable datatable = new Datatable(); datatable.Columns.Add(FIEldname,typeof(object)); DaTarow row = datatable.Rows.Add(dbnull.Value); object actual = DataAccess.GetValueOrDefault<object>(row,FIEldname); Assert.AreEqual(default(object),actual);} 总结 以上是内存溢出为你收集整理的c# – 单个方法,可以返回数据行中列的值,并自动处理列值为null的可能性全部内容,希望文章能够帮你解决c# – 单个方法,可以返回数据行中列的值,并自动处理列值为null的可能性所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)