我可以从扩展方法返回不同的类型

时间:2013-07-26 18:22:13

标签: c# linq datatable extension-methods

我基本上想编写一个DataTable扩展方法来隐藏一个通用的LINQ查询。假设我有下面的DataTables:

DataTable1

[ID]    [NameOfThing]    [DateOfThing]
1       'FirstName'      1/2/34
2       'SecondName'     5/6/78

DataTable2

[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似乎很可疑)但希望我抓住了我想要做的事情的想法。有可能,还是有其他好的选择?我可以为每个返回类型编写一个扩展方法,但我希望有一个更通用的方法。

3 个答案:

答案 0 :(得分:2)

你可以把它变成通用的:

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];

答案 1 :(得分:0)

您可以像这样更改方法以使用泛型

 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 result = DataTable2.GetDataItem<int>(3,"SomeFieldId","NumberOfItems")
string aString = DataTable1.GetDataItem<string>(1,"ID","NameOfThing")

答案 2 :(得分:0)

我可能会制作一个像这样的通用方法:

public static T GetDataItem<T>(this DataTable dTable, int idToMatch, 
                               string fieldToMatchIdTo, string fieldToReturn)  
{  
    var result = dTable.AsEnumerable()  
                       .Where(r => r.Field<int>(fieldToMatchTo) == idToMatch)
                       .FirstOrDefault();

    if (result == null)
    {
        return default(T);
    }
    else
    {
        return result.Field<T>(fieldToReturn);
    }
}

用法:

var anInt = DataTable2.GetDataItem<int>(3,"SomeFieldId","NumberOfItems")