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>
和泛型。任何帮助将非常感激!
我不认为这种方法有什么本质上的错误,但是在后面的实现中有一些问题-主要是,它不是良好的类型,不会编译。
考虑这个带有注释的更新版本
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
操作符——如果找到的值不能赋值,fixture
将为空。(或者,可以使用cast-and-guard而无需在T
上添加类限制。)Func<T,..>
接受类型为t的参数。然而,T
本身只是一个泛型参数,而不是类型为t的值。因此,原始代码中的lambda(T)
没有意义。解决方案是使用一个实际的(夹具)对象/值。函数接受
Func<T,T>
,不接受Action<T>
。在lambda语法中包含return
关键字使其产生一个函数。然而,从一开始就接受Action<T>
可能更有意义,除非函数可以返回一个不同的对象。
同样,在c#中"Lambda [Expressions]"指的是用于创建相应的action - func_expression -etc值的语法,但除此之外没有"Lambda类型"。