将多个委托添加到Func<;T>;并返回第一个lambda委托(C#)的结果
本文关键字:lambda 返回 第一个 委托 结果 添加 lt Func gt | 更新日期: 2023-09-27 18:01:00
我想向Func<T>
添加一个lambda函数。此外,我希望返回的值是第一个lambda委托的值(我最初无法更改顺序,第一个总是首先应用(。当我尝试使用+=
语法时,我得到以下内容:
错误44运算符"+="不能应用于类型为"
System.Func<TEntity>
"answers"lambda表达式"的操作数
我该如何实现上述目标?如果可能的话,我真的希望避免使用传统的委托语法。
class Transaction
{
static Func<TEntity> ifNullInitializeWithThisReturnedObject = () => default(TEntity);
public static bool IsDirty { get; private set; }
public init (Func<TEntity> IfNullInitializeWithThisReturnedObject)
{
ifNullInitializeWithThisReturnedObject = IfNullInitializeWithThisReturnedObject;
}
public void somemethod()
{
ifNullInitializeWithThisReturnedObject += () =>
{
IsDirty = true;
return default( TEntity );
};
}
}
为什么不使用传统的委托语法,然后显式获取调用列表?例如:
delegate int fdelegate();
var f1 = new Func<int>(() => { return 1; });
var f2 = new Func<int>(() => { return 2; });
var f1d = new fdelegate(f1);
var f2d = new fdelegate(f2);
fdelegate f = f1d;
f += f2d;
int returnValue;
bool first = true;
foreach (var x in f.GetInvocationList())
{
if (first)
{
returnValue = ((fdelegate)x)();
first = false;
}
else
{
((fdelegate)x)();
}
}
+=用于事件。您想要一个列表<Func<TEntity>>。给定这样一个列表,你可以这样做:
// funcList is an IEnumerable<Func<TEntity>> we got somehow
bool firstTime = true;
TEntity result;
foreach (f in funcList)
{
if (firstTime)
result = f();
else
f();
firstTime = false;
}
return result;
听起来你正试图使用lambda作为多播委托,但事实并非如此。
请参阅此StackOverflow问题:在C#中使用多播代理
我建议您重新使用Delegate语法,如下所示:http://msdn.microsoft.com/en-us/library/ms173175(v=vs.80(.aspx,或使用List<Func<TEntity>>
。
如果您创建了一个集合:List<Func<TEntity>>
?