【问题标题】:Can I Return Different Types From An Extension Method我可以从扩展方法返回不同的类型吗
【发布时间】:2013-07-26 18:22:12
【问题描述】:

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

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 似乎很可疑),但希望我能抓住我正在尝试做的事情的想法。有没有可能,或者还有其他好的选择吗?我可以为我想的每种返回类型编写一个扩展方法,但我希望那里有一种更通用的方法。

【问题讨论】:

  • 您可以使用泛型,用 T 替换条形。稍后我将在平板电脑上发布代码。

标签: c# linq datatable extension-methods


【解决方案1】:

你可以让它通用:

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

【讨论】:

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

    【讨论】:

      【解决方案3】:

      我可能会做一个这样的通用方法:

      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")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-15
        • 1970-01-01
        • 2018-04-06
        • 1970-01-01
        • 2011-07-16
        • 2011-11-21
        • 2021-12-25
        相关资源
        最近更新 更多