Muốn đưa ra khỏi đó mà không có nhiều lo lắng về việc nếu ai đó cung cấp một câu trả lời như một phương pháp mở rộng bởi vì một phần mở rộng phương pháp chỉ là một cách mát mẻ để gọi một phương pháp dụ. Tôi hiểu rằng bạn muốn câu trả lời mà không sử dụng một phương pháp mở rộng. Bất kể nếu phương thức được định nghĩa là static, instance hoặc extension - kết quả là như nhau.
Mã bên dưới sử dụng mã từ câu trả lời được chấp nhận để xác định phương pháp mở rộng và phương pháp thể hiện và tạo kiểm tra đơn vị để hiển thị đầu ra giống nhau.
public static class Extensions
{
public static void Each<T>(this IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}
}
[TestFixture]
public class ForEachTests
{
public void Each<T>(IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}
private string _extensionOutput;
private void SaveExtensionOutput(string value)
{
_extensionOutput += value;
}
private string _instanceOutput;
private void SaveInstanceOutput(string value)
{
_instanceOutput += value;
}
[Test]
public void Test1()
{
string[] teams = new string[] {"cowboys", "falcons", "browns", "chargers", "rams", "seahawks", "lions", "heat", "blackhawks", "penguins", "pirates"};
Each(teams, SaveInstanceOutput);
teams.Each(SaveExtensionOutput);
Assert.AreEqual(_extensionOutput, _instanceOutput);
}
}
Khá theo nghĩa đen, điều duy nhất bạn cần làm để chuyển đổi một phương pháp mở rộng cho một phương pháp dụ là loại bỏ các static
sửa đổi và các tham số đầu tiên của phương pháp.
Phương pháp này
public static void Each<T>(this IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}
trở thành
public void Each<T>(Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}
Nguồn
2013-10-30 02:35:44
mát. Bây giờ, cú pháp Func <> mà tôi đã thấy xung quanh sẽ đi vào đâu? – BuddyJoe
Func <> đại biểu là đại biểu chung cho các phương pháp có giá trị trả lại. Hành động <> đại biểu là đại biểu chung cho các phương thức KHÔNG trả về giá trị. Đó là sự khác biệt duy nhất. – TheSoftwareJedi
vì vậy trong trường hợp của bạn, bạn không cần phải trả lại một cái gì đó (từ console.writeline - vì vậy hành động là đủ. –
TheSoftwareJedi