Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使此扩展方法更通用?_C#_.net_Generics_Extension Methods - Fatal编程技术网

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

C# 如何使此扩展方法更通用?,c#,.net,generics,extension-methods,C#,.net,Generics,Extension Methods,我在尝试使下面的方法更通用,这样就可以为columnValues参数传入任何列表。以下是我所拥有的: public static DataRow NewRow(this DataTable dataTable, List<string> columnValues) { DataRow returnValue = dataTable.NewRow(); while (columnValues.Count > returnValue.Table.Columns.C

我在尝试使下面的方法更通用,这样就可以为
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;
}
publicstaticdatarow NewRow(此DataTable,DataTable,List columnValues)
{
DataRow returnValue=dataTable.NewRow();
while(columnValues.Count>returnValue.Table.Columns.Count)
{
returnValue.Table.Columns.Add();
}
returnValue.ItemArray=columnValues.ToArray();
返回值;
}
我可以将其更改为
列表
,并在将其传递给该方法之前转换原始列表,但我确信有一个更好的选项:-)

编辑:

弗兰克的帖子让我重新思考这个问题。在大多数情况下,源
列表
将是
列表
,因为列值很可能是不同的类型

对于我最初的使用,
列表
是有意义的,因为我是从CSV解析中创建数据集的,在那一点上都是文本。

怎么样

IEnumerable<object>

您基本上运气不佳,因为DataRow的项数组是一个对象数组,也就是说,最终只能传入对象列表

如果您输入列表的泛型参数,那么列表中的所有项都必须是该类型的,这很可能不有用

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

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

借助于将匿名类型值转换为字符串、对象字典,这应该是一件非常有用的事情。

为什么不直接使用
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;
}
那么你可以这样称呼它:

myDataTable.NewRow(1,2,"hello");

使用闭包指定如何根据输入类型生成ItemArray怎么样

public static DataRow NewRow<T>(this DataTable dataTable, List<T> columnValues, Func<T, string> itemArrayCriteria)
{
    DataRow returnValue = dataTable.NewRow();

    while (columnValues.Count > returnValue.Table.Columns.Count)
    {
        returnValue.Table.Columns.Add();
    }

    returnValue.ItemArray = columnValues.Select(x => itemArrayCriteria(x)).ToArray();
    return returnValue;
}
public static DataRow NewRow(此DataTable DataTable,List columnValues,Func itemArrayCriteria)
{
DataRow returnValue=dataTable.NewRow();
while(columnValues.Count>returnValue.Table.Columns.Count)
{
returnValue.Table.Columns.Add();
}
returnValue.ItemArray=columnValues.Select(x=>itemArrayCriteria(x)).ToArray();
返回值;
}

Lol你的观点非常好,我没有考虑过。对于我最初的使用,列表是有意义的,因为我是从CSV解析创建一个数据集的,该解析当时都是文本。对于大多数其他用途,这是没有意义的,因为列值很可能是不同的类型。
public static DataRow NewRow<T>(this DataTable dataTable, List<T> columnValues, Func<T, string> itemArrayCriteria)
{
    DataRow returnValue = dataTable.NewRow();

    while (columnValues.Count > returnValue.Table.Columns.Count)
    {
        returnValue.Table.Columns.Add();
    }

    returnValue.ItemArray = columnValues.Select(x => itemArrayCriteria(x)).ToArray();
    return returnValue;
}