我想将lambda函数添加到Func<T>
。此外,我希望返回的值是第一个lambda委托的值(我最初不能更改第一个将始终应用的顺序)。当我尝试使用+=
语法执行此操作时,我得到以下内容:
错误44运算符'+ ='无法应用于类型为'
System.Func<TEntity>
'和'lambda expression'的操作数
我如何实现上述目标?如果可能的话,我真的想避免使用传统的委托语法。
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 );
};
}
}
答案 0 :(得分:3)
为什么不使用传统的委托语法,然后显式获取调用列表?例如:
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)();
}
}
答案 1 :(得分:1)
+ =适用于活动。你想要一个List&lt; Func&lt; TEntity&gt;取代。给定这样的列表,你可以这样做:
// 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;
答案 2 :(得分:1)
听起来你正在尝试使用lambda作为多播委托,而不是它。
请参阅此StackOverlflow问题:Use of multicast in C# multicast delegates
我建议您回到使用代理语法:http://msdn.microsoft.com/en-us/library/ms173175(v=vs.80).aspx,或使用List<Func<TEntity>>
。
答案 3 :(得分:0)
如果您创建了一个集合,那该怎么办:List<Func<TEntity>>
?