Tôi có thể tạo các phương thức tiện ích mở rộng theo bất kỳ loại nào. Một khi loại đó là Func of int chẳng hạn.Phương pháp mở rộng cho hàm
Tôi muốn viết các phương thức mở rộng cho các hàm, không phải kiểu trả về của hàm.
tôi có thể làm điều đó một cách hacky:
Func<int> getUserId =() => GetUserId("Email");
int userId = getUserId.Retry(2);
Trường hợp chức năng Thử lại là một phương pháp mở rộng định nghĩa là:
public static T Retry<T>(this Func<T> func, int maxAttempts)
{
for (int i = 0; i < maxAttempts; i++)
{
try
{
return func();
}
catch
{
}
}
throw new Exception("Retries failed.");
}
Những gì tôi thực sự muốn làm là:
var userId = (() => GetUserId("Email")).Retry(2);
Nhưng trình biên dịch không hòa hợp chức năng dưới dạng Func của T.
tôi biết các tĩnh kể cả trong Roslyn, vì vậy tôi có thể làm điều gì đó như:
Retry(() => GetUserId("Email"), 2);
Nhưng tôi tìm thấy điều này khó khăn hơn để đọc. Tôi thực sự muốn chức năng trợ giúp mà tôi tạo ra. Có các mẫu khác trên đó có thể cho tôi kết quả tương tự, như biểu thức đơn thuần, hoặc sử dụng chuỗi (tức là chuyển T thành kiểu chuỗi, nội bộ có T, và sau đó tôi viết phương thức mở rộng cho Chuỗi T). Vấn đề tôi có với cách tiếp cận này là bạn phải bắt đầu biểu thức bằng cách truyền tới một Chuỗi T, và sau đó kết thúc biểu thức bằng cách truyền tới T, rất nhiều tiếng ồn kéo sự chú ý của người đọc ra khỏi logic nghiệp vụ của tôi.
Tôi biết tôi có thể sử dụng phép đúc ngầm trên Chuỗi T đến T, nhưng điều này có vẻ như nó đang thực hiện một số phép thuật đằng sau hậu trường.
Vì vậy, có thể lấy tham chiếu đến một hàm, mà không thực hiện nó trước, với ít hoặc không có mã mảng nồi hơi?
End của ngày nào đó tôi muốn viết những điều sau đây cho bất kỳ loại Func/Hành động:
var settings = LoadSettingsFromDatabase().Retry(2);
thạo API không phù hợp với yêu cầu của bạn? – alsafoo
Bạn * biết * rằng bạn không thể tạo phương thức tiện ích mở rộng cho lambda trực tiếp, bởi vì bạn đã thực hiện và thấy lỗi. Tại thời điểm đó nó chỉ đơn giản là đi xuống đến sở thích cá nhân của những gì có nghĩa là gõ lambda như một đại biểu mà bạn cá nhân thích, mà chỉ đơn giản là một vấn đề của ý kiến. Có rất nhiều cách để làm điều đó; bạn đã cung cấp một số. – Servy
@alsafoo Fluent API sử dụng mẫu chuỗi mà tôi biết nhưng muốn tránh. Tôi sử dụng API thông thạo để xác thực đầu vào, nhưng sẽ không muốn sử dụng nó cho logic nghiệp vụ. – user1909158