Cor*_*ton 6 .net c# generics extension-methods
我有一个大脑屁试图使下面的方法更通用,以便任何List<T>可以传入columnValues参数.这就是我所拥有的:
public static DataRow NewRow(this DataTable dataTable, List<string> columnValues)
{
DataRow returnValue = dataTable.NewRow();
while (columnValues.Count > returnValue.Table.Columns.Count)
{
returnValue.Table.Columns.Add();
}
returnValue.ItemArray = columnValues.ToArray();
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
我可以将它更改为a List<object>并在将其传递给方法之前转换原始列表但我确信有更好的选择:-)
编辑:
弗兰克的帖子让我重新思考这一点.在大多数情况下,源List<T>将是一个,List<object>因为列值很可能是不同的类型.
对于我最初的使用是List<string>有道理的,因为我是从CSV解析创建一个数据集,这是该点的所有文本.
为什么不用 params object[]:
public static DataRow NewRow(this DataTable dataTable, params object[] objects)
{
DataRow returnValue = dataTable.NewRow();
while (objects.Length > returnValue.Table.Columns.Count)
{
returnValue.Table.Columns.Add();
}
returnValue.ItemArray = objects;
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样调用它:
myDataTable.NewRow(1,2,"hello");
Run Code Online (Sandbox Code Playgroud)
你基本上不走运,因为DataRow的Item Array是一个对象数组,也就是说,最终你只能传入对象列表。
如果您放入列表的通用参数,则列表中的所有项目都必须属于该类型,这不太可能有用。
话虽如此,为了获得大量具有不同类型的列,您可以更改扩展方法以接受实例化匿名类型的对象:
table.NewRow(new { A = "Hello", B = 1, C = DateTime.Now })
Run Code Online (Sandbox Code Playgroud)
借助通过反射或动态方法将匿名类型值转换为字符串、对象字典,它应该是一个相当有用的东西。
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |