c# - 我可以从扩展方法返回不同类型吗

标签 c# linq datatable extension-methods

我基本上想编写一个 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/

相关文章:

c# - Entity Framework 3.5 动态创建实体

c# - 使用 .NET 删除所有 HTML 标签并格式化带有回车、空格等的文本

c# - 如何使用 .NET HttpWebRequest API 从响应中读取 HTTP header ?

C# - WebForms - 可以复制 HttpContext.Current.SessionID 吗?

c# - 即使要连接的行不存在,也使 JOIN 查询匹配

css - 更改宽度过滤器输入框 primefaces 数据表

javascript - jQuery Datatables 按钮显示为链接..而不是按钮

c# - 选择第一个记录每个组

C#:ToArray 性能

javascript - 使用 jquery 查找数据表的表格单元格的内部值