如何使此扩展方法更通用?

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解析创建一个数据集,这是该点的所有文本.

BFr*_*ree 5

为什么不用 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)


flq*_*flq 4

你基本上不走运,因为DataRow的Item Array是一个对象数组,也就是说,最终你只能传入对象列表。

如果您放入列表的通用参数,则列表中的所有项目都必须属于该类型,这不太可能有用。

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

table.NewRow(new  { A = "Hello", B = 1, C = DateTime.Now })
Run Code Online (Sandbox Code Playgroud)

借助通过反射或动态方法将匿名类型值转换为字符串、对象字典,它应该是一个相当有用的东西。