Lambda函数中的泛型c#方法

本文关键字:方法 泛型 函数 Lambda | 更新日期: 2023-09-27 18:05:46

我试图更好地理解lambda表达式与泛型方法,我有一些代码打开连接,并从我经常使用的会话获取一些信息。

我的目标是传入一个T类型的对象,然后它可以从lambda表达式内的fixture获取数据。

 protected T getDataFromFixture<T>(int fixture_id, TTFixture fixture, Func<T, T> lambda)
 {
     var fixtures = Session.AllFixtures;
     fixture = fixtures.ContainsKey(fixture_id) ? fixtures[fixture_id] : null;
     if (fixture != null)
     {
          return lambda(T);
     } 
     return default(T);
 } 

问题是:我如何通过lambda函数传递到openConnectionWithFixtureObject哪个可以访问fixture对象并返回类型T

之类的. .

string total;
TTFixture fixture;
openConnectionWithFixtureObject<StatTotalList>(_fixtureUid, fixture, (statTotalsForOverview) => 
{
    total; = fixture.myTotal();
});

我不认为逻辑太远,我只是不熟悉Func<T,TResult>和泛型。任何帮助将非常感激!

Lambda函数中的泛型c#方法

我不认为这种方法有什么本质上的错误,但是在后面的实现中有一些问题-主要是,它不是良好的类型,不会编译。

考虑这个带有注释的更新版本

protected T openConnectionWithFixtureObject<T>(
    int fixture_id, /* #1 */ Func<T, T> decorate) 
    where T : class /* for #3 */
{
     // ..
     var fixtures = MyMobileSession.Current.MyClub.MySport.AllFixtures;
     T fixture = fixtures.ContainsKey(fixture_id)
         ? fixtures[fixture_id] as T  /* #3 */
         : null;
     if (fixture != null)
     {
       /* #2 */
       return decorate(fixture);
     }
     // ..
}
openConnectionWithFixtureObject<StatTotalList>(_fixtureUid, /* #1 */
    /* #4 */
    (statTotalsForOverview) => {
        statTotalsForOverview.total = fixture.myTotal();
        return statTotalsForOverview;
    });
  1. 删除了TTFixture fixture参数/参数,因为它对ID查找没有意义,并且会由于重新声明fixture而导致错误。

  2. fixture表达式需要输入为T,以便传递给Func<T,..>。在这种情况下,可以使用as操作符——如果找到的值不能赋值,fixture将为空。(或者,可以使用cast-and-guard而无需在T上添加类限制。)

  3. Func<T,..>接受类型为t的参数。然而,T本身只是一个泛型参数,而不是类型为t的值。因此,原始代码中的lambda(T)没有意义。解决方案是使用一个实际的(夹具)对象/值。

  4. 函数接受Func<T,T>,不接受Action<T>。在lambda语法中包含return关键字使其产生一个函数。然而,从一开始就接受Action<T>可能更有意义,除非函数可以返回一个不同的对象。

同样,在c#中"Lambda [Expressions]"指的是用于创建相应的action - func_expression -etc值的语法,但除此之外没有"Lambda类型"。