Tôi đang tìm cách cải thiện tính nhất quán, ngắn gọn và khả năng đọc của một số mã trong ứng dụng tôi đang thực hiện. Mã bắt đầu trông giống như sau:Phương pháp mở rộng C# trên loại với đối số loại chung
context.GetGraphType<Bar>().Subscribe<Fizz>(
(instance, evt) => e.Execute((Bar)instance.Instance)
);
Có một số dòng mã gần như giống hệt như trên. Tôi muốn viết lại nó để trông giống như sau:
typeof(Bar).SubscribeTo<Fizz>(context);
Một điều, điều này sẽ cho phép tôi tận dụng chính thức những gì đã trở thành một quy ước không chính thức. Ngoài ra, tôi hy vọng rằng nó bây giờ sẽ đọc một cái gì đó như "thanh đăng ký cho sự kiện fizz trên bối cảnh nhất định", chứ không phải là "bối cảnh được loại thanh và đăng ký để fizz và sau đó hiện một số công cụ." Tôi nghĩ rằng dòng chảy là tốt hơn, và đồng nghiệp tôi hỏi về nó đã đồng ý.
Tôi bắt đầu triển khai phương thức này dưới dạng phương thức tiện ích mở rộng. Để thực hiện điều này, tôi muốn sử dụng lớp cơ sở chung trừu tượng cho loại sự kiện, vì vậy Fizz
sẽ là Event<T>
. Điều này có nghĩa là đối số kiểu chung cho phương thức mở rộng sẽ phải bị ràng buộc là kiểu mà phương thức mở rộng được gọi. Vì vậy, đối với ví dụ trên, Fizz
sẽ phải thuộc loại Event<Bar>
.
Điều này có khả thi không? Tôi đã đi với một giải pháp thay thế trong thời gian có nghĩa là, nhưng tôi vẫn còn tò mò nếu nó có thể được thực hiện. Các đề xuất khác cũng được hoan nghênh.
Cảm ơn!
Chỉnh sửa # 1: Chỉ cần rõ ràng, tôi nhận ra rằng tôi có thể sử dụng thông số loại bổ sung, nhưng tôi đang tìm cách tránh điều đó nếu có thể.
Chỉnh sửa # 2: Tôi nghĩ rằng tôi sẽ đi với một biến thể nhỏ của câu trả lời được chấp nhận, vì nó không phù hợp với 100% với kịch bản của tôi. Điểm mấu chốt là một lớp tĩnh chung có thể được sử dụng thay vì một phương thức mở rộng của Type để hoàn thành mục tiêu của tôi. Cảm ơn dss539!
Cập nhật mã (có thể có lỗi chính tả kể từ khi tôi đang làm điều này một cách nhanh chóng):
public class Bar { }
public class Event<TSubscriber>
{
public abstract void Execute(TSubscriber source);
}
public class Fizz : Event<Bar>
{
public override void Execute(Bar bar)
{
// respond to event
}
}
public class Context { }
public static class ForType<TSubscriber>
{
public static void SubscribeTo<TEvent>(Context context)
where TEvent : Event<TSubscriber>
{
context.GetType<TSubscriber>().Subscribe<TEvent>(
(evt, args) => evt.Execute((TSubscriber)args.Source));
}
}
public static void Run()
{
ForType<Bar>.SubscribeTo<Fizz>(context);
}
Tôi không hiểu câu hỏi của bạn. Chữ ký phương thức hiện tại của bạn trông như thế nào? 'Đăng ký (loại Loại này, Hành động )'? Nếu bạn cho thấy những gì bạn có (hoặc tương đương), điều đó có thể giúp giải thích. –
dss539
Tôi nghĩ rằng tôi đã có một vấn đề thiết kế tương tự trong khi trở lại. Chúc may mắn :) – leppie
@ dss539 Nó sẽ giống như Đăng ký (Loại loại này, Ngữ cảnh ctx). Vấn đề là không có cách nào (mà tôi biết) để hạn chế T là loại tham số Event . –