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

时间:2011-06-30 15:02:33

标签: c# delegates lambda

我想将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 ); 
        };
    }
}

4 个答案:

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