我正在尝试使用extensionmethod对DataTable进行排序。如果在代码体中使用,这可以正常工作:
DataView dv = dtSensors.DefaultView;
dv.Sort = "DeviceName";
dtSensors = dv.ToTable();
然而,像这样使用它不会:
public static void SortTable(this DataTable dt, string sortColumn)
{
DataView dv = dt.DefaultView;
dv.Sort = sortColumn;
dt = dv.ToTable();
}
为什么扩展方法在这种情况下不起作用?
谢谢,
彼得
答案 0 :(得分:2)
您在方法中为dt
分配了一个新值,但不会更改调用方法时使用的变量 - 它是一个值参数。
作为一个简单的例子:
using System;
static class Int32Extensions
{
// This doesn't do what you might expect it to!
public static void Increment(this int x)
{
x = x + 1;
}
}
class Test
{
static void Main()
{
int x = 10;
x.Increment();
Console.WriteLine(x); // Still 10
}
}
我个人会将方法写入返回新表,并适当修改名称:
public static DataTable SortedBy(this DataTable dt, string sortColumn)
{
DataView dv = dt.DefaultView;
dv.Sort = sortColumn;
return dv.ToTable();
}
然后将其用作:
table = table.SortedBy("columnName");
我稍微关注对DefaultView
的修改是否会在原始表格中保留 - 这样的方法改变是不理想的原始物体。这取决于DefaultView
每次调用时都会创建一个新视图......