将多个委托添加到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 ); 
        };
    }
}

将多个委托添加到Func<;T>;并返回第一个lambda委托(C#)的结果

为什么不使用传统的委托语法,然后显式获取调用列表?例如:

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>>