2011-07-03 26 views
22

Phương pháp C# có thể trả về một phương thức không?Phương pháp C# có thể trả về một phương thức không?

Phương pháp có thể trả lại ví dụ lambda expression, nhưng tôi không biết loại tham số kiểu nào tôi có thể cung cấp cho phương thức như vậy, bởi vì phương thức không phải là Type. Phương thức trả về như vậy có thể được gán cho một số đại biểu.

xem xét khái niệm này là một ví dụ:

public <unknown type> QuadraticFunctionMaker(float a , float b , float c) 
{ 
    return (x) => { return a * x * x + b * x + c; }; 
} 

delegate float Function(float x); 
Function QuadraticFunction = QuadraticFunctionMaker(1f,4f,3f); 
+1

Bạn đã * đã * khai báo loại đại biểu cần thiết. Câu hỏi của bạn chính xác ở đây là gì? –

Trả lời

31

Các loại bạn đang tìm kiếm là Action<> hoặc Func<>.

Các tham số chung trên cả hai loại xác định chữ ký loại của phương thức. Nếu phương thức của bạn không có giá trị trả về, hãy sử dụng Action. Nếu giá trị trả về sử dụng Func theo đó thông số chung cuối cùng là loại trả về.

Ví dụ:

public void DoSomething()       // Action 
public void DoSomething(int number)    // Action<int> 
public void DoSomething(int number, string text) // Action<int,string> 

public int DoSomething()       // Func<int> 
public int DoSomething(float number)    // Func<float,int> 
public int DoSomething(float number, string text) // Func<float,string,int> 
0

biểu thức lambda của bạn sẽ mất một float như một tham số (Tôi tin), và sau đó trả về một float là tốt. Trong .NET, chúng tôi có thể đại diện cho điều này theo loại Func<float, float>.

Nói chung, nếu bạn đang xử lý lambdas có nhiều tham số hơn, bạn có thể sử dụng Func<Type1, Type2, Type3, ..., ReturnType>, với tối đa tám thông số.

15
public Func<float, float> QuadraticFunctionMake(float a, float b, float c) { 
    return x => a * x * x + b * x + c; 
} 

Các kiểu trả về là Func<float, float>.

-1

Bạn có thể sử dụng từ khóa dynamic. Xem dynamic (C# Reference).

+5

Đây là lựa chọn tồi tệ nhất có thể. –

+0

phím năng động, tất cả nó là bỏ qua việc kiểm tra kiểu thời gian biên dịch và sử dụng từ khóa này sẽ là một hack chứ không phải là giải pháp – RaM

+0

Mặc dù nó không phải là giải pháp kiểu tĩnh, nó sẽ hoạt động và hữu ích trong vấn đề đó, ngay cả khi "hack." – Paul

2

<unknown type> = Function. Tức là,

public Function QuadraticFunctionMaker(float a , float b , float c) 
{ 
    return (x) => { return a * x * x + b * x + c; }; 
} 

Là những gì bạn đang tìm kiếm vì bạn đã khai báo đại biểu Function để khớp. Ngoài ra, bạn không cần khai báo một đại biểu nào cả và có thể sử dụng Func<float, Float> như được người khác chú ý. Điều này là chính xác tương đương. Thực tế, Func<T, T> được khai báo giống hệt như đại biểu của bạn Function ngoại trừ việc nó là chung chung.

+0

Tốt hơn nên sử dụng những thứ như 'Func <>' và 'Action <>'. Tôi tin rằng MS đang di chuyển khỏi việc có các đại biểu tùy chỉnh khắp nơi. – siride

+0

Đây là câu trả lời duy nhất tốt. Tôi sẽ bỏ phiếu cho mọi câu trả lời khác ... – Jeff

+0

@siride: không có nó không.Khi bạn muốn làm rõ ý định của mình, đại biểu được xác định rõ ràng là tốt hơn – Jeff

-3

Tôi nghĩ, một Tuple sẽ phù hợp trong hoàn cảnh của bạn. Để biết thêm thông tin, hãy xem tại đây http://sankarsan.wordpress.com/2009/11/29/tuple-in-c-4-0/.

+2

Tuple phải làm gì với điều này? Anh ta không trả lại cặp hoặc ba bộ dữ liệu, anh ta trả về một giá trị duy nhất. – siride

Các vấn đề liên quan