我基本上想编写一个 DataTable 扩展方法来隐藏通用 LINQ 查询。假设我有下面的数据表:
数据表1
[ID] [NameOfThing] [DateOfThing]
1 'FirstName' 1/2/34
2 'SecondName' 5/6/78
数据表2
[SomeFieldId] [NumberOfItems]
3 934
4 20393
我希望能够调用扩展方法,例如 string aString = DataTable1.GetDataItem(1,"ID","NameOfThing")
或
int anInt = DataTable2.GetDataItem(3,"SomeFieldId","NumberOfItems")
我认为我的扩展方法看起来像这样:
public static var GetDataItem(this DataTable dTable, int idToMatch
,string fieldToMatchIdTo, string fieldToReturn)
{
DataRow [] results = dTable.AsEnumerable()
.Where(r => r.Field`<int>`(fieldToMatchTo) == idToMatch).ToArray();
return (var)results[0][fieldToReturn];
}
我知道这里遗漏了很多东西(转换为 var 似乎很可疑),但希望我捕获了我想要做的事情的想法。有可能吗,或者还有其他好的选择吗?我可以为我认为的每种返回类型编写一个扩展方法,但我希望有一种更通用的方法。
最佳答案
您可以将其设为通用:
public static T GetDataItem<T>(this DataTable dTable, int idToMatch, string fieldToMatchIdTo, string fieldToReturn)
{
DataRow results = dTable.AsEnumerable()
.Where(r => r.Field<int>(fieldToMatchTo) == idToMatch).ToArray();
return (T)results[0][fieldToReturn];
}
你可以这样称呼:
int anInt = DataTable2.GetDataItem<int>(3,"SomeFieldId","NumberOfItems");
如果由于某种原因您不知道返回值的类型,则只需返回对象。
请注意,由于您希望至少有一行匹配,因此可以使用 First
而不是 Where
:
DataRow row = dTable.AsEnumerable().First(r => r.Field<int>(fieldToMatchTo) == idToMatch);
return (T)row[fieldToReturn];
关于c# - 我可以从扩展方法返回不同类型吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17888376/