2010-02-17 39 views
7

Tôi đã tạo ra phương pháp này mà là một nhà máy đối tượng:Tạo phương pháp chung chung và sử dụng loại tham số

public static T GetService<T>(T serviceInterface) 
{ 
    if (serviceInterface.Equals(typeof(IMemberService))) 
    { 
     return (T)(object)new MemberService(); 
    } 
    else if (serviceInterface.Equals(typeof(ILookupService))) 
    { 
     return (T)(object)new LookupService(); 
    } 
    throw new ArgumentOutOfRangeException("No action is defined for service interface " + serviceInterface.Name); 
} 

Bây giờ, tôi muốn đi xa hơn và loại bỏ nhu cầu tham số "serviceInterface", nhưng vấn đề của tôi là - Tôi không biết cách so sánh thông số loại T với giao diện: làm

T.Equals(typeof(ILookupService)) 

cho lỗi trình biên dịch: 'T' là 'tham số kiểu', không hợp lệ trong ngữ cảnh đã cho.

Bất kỳ ý tưởng nào về cách tôi có thể so sánh thông số loại với giao diện?

Cảm ơn bạn, Andrey

+0

Bạn có thể chọn giá trị từ dịch vụBiến tương tác như thế này -> https://stackoverflow.com/a/44114122/1580548 – ddagsan

Trả lời

7

Bạn có thể sử dụng typeof(T) để có được một Type đối tượng lại có thể thay thế việc sử dụng các serviceInterface

Ví dụ

public static T GetService<T>() 
{ 
    Type serviceInterface = typeof(T); 
    if (serviceInterface.Equals(typeof(IMemberService))) 
    { 
     return (T)(object)new MemberService(); 
    } 
    else if (serviceInterface.Equals(typeof(ILookupService))) 
    { 
     return (T)(object)new LookupService(); 
    } 
    throw new ArgumentOutOfRangeException("No action is defined for service interface " + serviceInterface.Name); 
} 
+0

Chết tiệt, giờ tôi rất xấu hổ! Soooo đơn giản! Cảm ơn một đám Jared! – Andrey

+0

Chắc chắn, nhưng nó sẽ bao giờ bằng một giao diện? Nếu T đại diện cho loại đối tượng cụ thể, chắc chắn nó sẽ không bằng một giao diện. – spender

+0

@spender, Phương thức GetService cũng có thể được gọi bằng giao diện. Ví dụ: GetService (); – JaredPar

1

Sử dụng typeof(T).

Vì vậy,

typeof(T).Equals(typeof(ILookupService)) 
0

thể các nhà điều hành is được áp dụng ở đây?

+0

'is' áp dụng cho * đối tượng * không * lớp *, vì vậy không, nó sẽ không không cung cấp OP với một giải pháp. Nó có thể có thể được sử dụng trong thiết kế ban đầu của anh ta, nhưng không phải khi loại bỏ tham số. – jv42

1
if (typeof(IMemberService).IsAssignableFrom(typeof(T))) 
{} 
else if (typeof(ILookupService).IsAssignableFrom(typeof(T))) 
{} 
+0

Kết hợp câu trả lời này ('IsAssignableFrom') với câu trả lời của JaredPar, và bạn sẽ có giải pháp hoàn chỉnh. – fre0n

+0

Có gì sai với giải pháp ban đầu của tôi? Tôi cần phải biết nếu loại thông qua khớp chính xác với giao diện tôi so sánh với – Andrey

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