我正在尝试使用泛型方法更好地理解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>
和泛型。非常感谢任何帮助!
答案 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;
});
删除了TTFixture fixture
参数/参数,因为ID查找没有任何意义,并且由于重新声明fixture
而导致错误。
fixture
表达式需要输入为T
,以便将其传递给Func<T,..>
。在这种情况下,可以使用as
operator - 如果找不到值,fixture
将为空。 (或者,可以在T
没有添加类限制的情况下使用强制转换。)
Func<T,..>
接受 类型为T的参数。但是,T
本身只是一个通用参数而不是一个值类型为T.因此,原始代码中的lambda(T)
没有意义。解决方案是使用实际(fixture)对象/值。
该函数接受Func<T,T>
而非Action<T>
。在lambda语法中包含return
关键字会使其产生一个函数。但是,从一开始就接受Action<T>
可能更有意义,除非该函数可以返回不同的对象。
此外,在C#中"Lambda [Expressions]"指的是用于创建相应的Action-Func-Expression-etc值的语法 - 但除此之外,没有&#34; lambda类型&#34;。