C# · 12月 25, 2021

c# – 如何使这种扩展方法更通用?

我有一个大脑放屁试图使下面的方法更通用,以便任何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;}

我可以将其更改为List< object>并在将原始列表传递给方法之前将其转换,但我确信有更好的选择:-)

编辑:

弗兰克的帖子让我重新思考这一点.在大多数情况下,源列表< T>将是List< object>因为列值很可能是不同的类型.

对于我最初使用的List< string>是有道理的,因为我是从CSV解析创建一个数据集,这是该点的所有文本.

解决方法 你基本上没有运气,因为DaTarow的Item数组是一个对象数组,也就是说,最终你只能传入对象列表.

如果您输入列表的通用参数,则列表中的所有项都必须属于该类型,这几乎不可能有用.

话虽如此,为了获得众多不同类型的列,您可以更改扩展方法以接受实例化匿名类型的对象:

table.NewRow(new { A = “Hello”,B = 1,C = DateTime.Now })

有了帮助将匿名类型值转换为字符串,对象字典by reflection or by a dynamic method应该是一个相当有用的东西.