Làm cách nào để trả về giá trị từ Action ()?


92

Liên quan đến câu trả lời cho câu hỏi này Truyền DataContext vào Action () , làm cách nào để trả về một giá trị từ action (db)?

SimpleUsing.DoUsing(db => { 
// do whatever with db 
}); 

Nên giống như sau:

MyType myType = SimpleUsing.DoUsing<MyType>(db => { 
// do whatever with db.  query buit using db returns MyType.
}); 

Câu trả lời:


97

Phương thức tĩnh của bạn sẽ đi từ:

public static class SimpleUsing
{
    public static void DoUsing(Action<MyDataContext> action)
    {
        using (MyDataContext db = new MyDataContext())
           action(db);
    }
}

Đến:

public static class SimpleUsing
{
    public static TResult DoUsing<TResult>(Func<MyDataContext, TResult> action)
    {
        using (MyDataContext db = new MyDataContext())
           return action(db);
    }
}

Câu trả lời này không có ý kiến ​​để tôi có thể cung cấp mã. Để biết đầy đủ chi tiết, vui lòng xem câu trả lời của @ sll bên dưới.


113

Bạn có thể sử dụng Func<T, TResult>đại biểu chung. (Xem MSDN )

Func<MyType, ReturnType> func = (db) => { return new MyType(); }

Ngoài ra, có các đại biểu chung hữu ích coi là giá trị trả về:

  • Converter<TInput, TOutput>( MSDN )
  • Predicate<TInput>- luôn trả về bool ( MSDN )

Phương pháp:

public MyType SimpleUsing.DoUsing<MyType>(Func<TInput, MyType> myTypeFactory)

Đại biểu chung:

Func<InputArgumentType, MyType> createInstance = db => return new MyType();

Hành hình:

MyType myTypeInstance = SimpleUsing.DoUsing(
                            createInstance(new InputArgumentType()));

HOẶC rõ ràng:

MyType myTypeInstance = SimpleUsing.DoUsing(db => return new MyType());

Đúng - bạn có thể cung cấp một ví dụ về phương thức này trông như thế nào không?
4thSpace,

5
@LB - yêu cầu mọi người google không mang tính xây dựng. SO tồn tại để cung cấp câu trả lời đầy đủ.
Kirk Woll

5
@KirkWoll Nhưng câu trả lời là các thành phần , nó chưa được nấu chín
LB

9
@LB - tốt hơn là nó hoàn chỉnh. Tôi thấy sự tương tự của bạn là giả.
Kirk Woll

1
@LB, tốt hơn là đừng bình luận vì bạn không thêm bất kỳ giá trị nào.
4thSpace,

15

Bạn cũng có thể tận dụng lợi thế của thực tế là một phương thức lambda hoặc ẩn danh có thể đóng trên các biến trong phạm vi bao quanh của nó.

MyType result;

SimpleUsing.DoUsing(db => 
{
  result = db.SomeQuery(); //whatever returns the MyType result
}); 

//do something with result

vâng, đây được gọi là Đóng cửa (nội dung ngôn ngữ vui nhộn cũng có sẵn cho chúng tôi)
sll

4

Sử dụng Func<T>hơn là Action<T>.

Action<T>hoạt động giống như một phương thức void với tham số kiểu T, trong khi Func<T>hoạt động giống như một hàm không có tham số và trả về một đối tượng kiểu T.

Nếu bạn muốn cung cấp các tham số cho hàm của mình, hãy sử dụng Func<TParameter1, TParameter2, ..., TReturn>.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.