2010-10-30 29 views
33

Khi tôi đang cố gắng để sử dụng params trong một đại biểu hành động ...Tôi có thể sử dụng các tham số trong Hành động hoặc Func đại biểu không?

private Action<string, params object[]> WriteToLogCallBack; 

tôi nhận thiết kế này thời gian lỗi:

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

Bất kỳ sự giúp đỡ!

+1

thông số không phải là loại, nghĩa là bạn có thể sử dụng 'ref' trong định nghĩa loại? –

Trả lời

35

Giải pháp này như thế nào?

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

Hoặc bạn có thể xác định loại đại biểu của riêng bạn:

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

Làm thế nào để bạn gọi nó bằng lambda? – toddmo

3

Bạn có thể sử dụng params trong tờ khai thực tế của một đại biểu, nhưng không phải trong loại một. Các tham số chung cho một Hành động chỉ là các kiểu, không phải các đối số thực được truyền khi gọi người đại diện. params không phải là một loại, nó là một từ khóa.

9

Các thông số kiểu biến thể không thể thực hiện được trong C#.

Đó là lý do tại sao có nhiều tuyên bố cho Action<...>, Func<...>Tuple<...> chẳng hạn. Nó sẽ là một tính năng thú vị, mặc dù. C++ 0x has them.

+0

Không chắc chắn nó sẽ hoạt động tốt như thế nào với generics (trái ngược với các mẫu). – CodesInChaos

0

Bạn có thể thử điều này. Nó cho phép đối với bất kỳ số lượng đối số nào và bạn sẽ nhận được một lỗi thời gian biên dịch nếu bạn chuyển nhầm số hoặc loại đối số.

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)); 
Các vấn đề liên quan