Lambda函数采用通用C#方法

时间:2014-05-30 04:28:14

标签: c# lambda func

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

我的目标是传入Type 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>和泛型。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

我不认为这种方法存在任何本质上的错误,但是在帖子中实现存在一些问题 - 主要是,它不是很好的类型,也不会编译。

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

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 operator - 如果找不到值,fixture将为空。 (或者,可以在T没有添加类限制的情况下使用强制转换。)

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

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

  5. 此外,在C#中"Lambda [Expressions]"指的是用于创建相应的Action-Func-Expression-etc值的语法 - 但除此之外,没有&#34; lambda类型&#34;。