有没有办法做&gt; public void test <a,b,c,....,z>(...)</a,b,c,....,z>

时间:2010-11-01 17:55:17

标签: c#

我尝试创建一个构建快速DataTable的方法 我目前的代码是这样的

实施

var table = build("myTableName").col<int>("col1").col<string>("col2")
.row(1, "row1")
.row(2, "row2");

public static DataTable build(string name)
{
 return new DataTable(name);
}

public static DataTable col<T>(this DataTable table, string name)
{
 table.Columns.Add(colName, typeof(T));
 retun table;
}

public static DataTable row(this DataTable table, params object[] objects)
{
 DataRow row = table.NewRow();
 int i = 0;           
 objects.ToList().ForEach(obj => row[i++] = obj ?? DBNull.Value);
 table.Rows.Add(row);

 return table;
}
如果有办法做多种类型的参数,我可以把事情做得更快。 比如

public static col<A,B,C, ...>col(params string[] names){...}

4 个答案:

答案 0 :(得分:2)

您可以创建多个类型参数,但是您必须为每个必须支持的列数进行显式重载。

在我看来,这样做并不是一个好主意。 可能使您可以更快地编写这段代码,但我认为阅读起来会困难得多。可读性非常重要 - 代码通常比编写代码更频繁地阅读。

答案 1 :(得分:1)

实现此目的的唯一方法是为每个参数创建一个重载,因此一个col<T>,一个col<T1, T2>等等。

.NET框架做同样的事情。例如,出于这个原因,Func<T>有17个版本。

答案 2 :(得分:1)

由于您只是在另一个方法调用中使用该类型作为参数,因此不会起作用:

public static DataTable cols(this DataTable table, string[] names, Type[] types)
{
    for(...)
    {
        table.Columns.Add(names[i], types[i]); 
    }
    return table;
}

.cols(new string[] {"col1", "col2"}, new Type[] {typeof(int), typeof(string)})

不漂亮,有很多方法可以改进“传递和迭代2个阵列,希望它们的大小相同”,但这是一般的想法。做一些检查,并且可能使用结构来传递数据,应该可以正常工作。

答案 3 :(得分:0)

这应该有效:

public static DataTable col<T1>(this DataTable table, string name1)
{
    table.Columns.Add(name1, typeof(T1));
    return table;
}

public static DataTable col<T1, T2>(this DataTable table, string name1, string name2)
{
    table.Columns.Add(name1, typeof(T1));
    table.Columns.Add(name2, typeof(T2));
    return table;
}

public static DataTable col<T1, T2, T3>(this DataTable table, string name1, string name2, string name 3)
{
    table.Columns.Add(name1, typeof(T1));
    table.Columns.Add(name2, typeof(T2));
    table.Columns.Add(name3, typeof(T3));
    return table;
}

最后:

public static DataTable cols(this DataTable table, Type[] types, string[] names)
{
    // ...
}