2010-10-30 30 views
33

Bir Eylem temsilci params kullanmaya çalışıyorum ...Param'leri Action veya Func temsilcilerinde kullanabilir miyim?

Ben bu tasarım zamanı hatası aldı
private Action<string, params object[]> WriteToLogCallBack; 

:

Invalid token 'params' in class, struct, or interface member declaration

Herhangi bir yardım!

+1

params bir tür değil, tür tanımında 'ref 'kullanabilirsiniz? –

cevap

35

Bu geçici çözüm nasıl yapılır?

delegate void LogAction(string s, params object[] args); 
+0

Bunu nasıl bir lambda ile çağırıyorsunuz? – toddmo

3

Bir temsilci gerçek bildiriminde params kullanabilirsiniz ancak birinin türü:

private Action<string, object[]> writeToLogCallBack; 
public void WriteToLogCallBack(string s, params object[] args) 
{ 
    if(writeToLogCallBack!=null) 
    writeToLogCallBack(s,args); 
} 

Ya da kendi temsilci türü tanımlayabiliriz. Bir Eylem için genel parametreler yalnızca temsilcilerdir, temsilci çağrılırken iletilecek gerçek argümanlar değildir. Param bir tür değil, bir anahtar kelimedir.

9

Değişken türü parametreler C# ile mümkün değildir.

Bu nedenle, örneğin Action<...>, Func<...> ve Tuple<...> için çok sayıda bildirim vardır. Yine de ilginç bir özellik olurdu. C++ 0x has them.

+0

Jeneriklerle ne kadar iyi çalışacağından emin değil (şablonların aksine). – CodesInChaos

0

Bunu deneyebilirsiniz. Herhangi bir sayıda argümana izin verir ve yanlış numarayı veya argüman türünü iletirseniz bir derleme zamanı hatası alırsınız.

public delegate T ParamsAction<T>(params object[] oArgs); 

public static T LogAction<T>(string s, ParamsAction<T> oCallback) 
{ 
    Log(s); 
    T result = oCallback(); 
    return T; 
} 

Foo foo = LogAction<Foo>("Hello world.", aoArgs => GetFoo(1,"",'',1.1)); 
İlgili konular