2011-06-30 13 views
1

我想將一個lambda函數添加到Func<T>。此外,我希望返回的值是第一個lambda委託的值(我不能首先更改第一個總是首先應用的順序)。當我嘗試用+=語法要做到這一點,我得到如下:將多個代理添加到Func <T>並返回第一個lambda委託(C#)的結果?

錯誤44運算符「+ =」不能應用於類型爲「System.Func<TEntity>」和「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); 
     }; 
    } 
} 
+2

你能展示一些更多的代碼嗎? – user7116

+0

與問題無關,但您確定您的init方法正確嗎?你不應該交換任務的r/l嗎? –

+0

我沒有看到問題應該在這裏。應該編譯。 – nawfal

回答

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

那裏聲明的語法過多。你可以減少到'fdelegate f =()=> 1; f + =()=> 2;' –

1

+ =表示事件。你想要一個列表< 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; 
+0

這應該工作,但'+ ='是爲多播委託。基本上所有的代表。 – nawfal

0

如果你創建了一個集合:List<Func<TEntity>>

相關問題