2012-07-25 28 views
6

Tôi đang triển khai giao diện để chèn logic nghiệp vụ tùy chỉnh vào một khung công tác sử dụng Microsoft Unity. Vấn đề cốt lõi của tôi là giao diện tôi cần triển khai xác định phương thức sau:Thực hiện giao diện với kiểu generic ít bị ràng buộc hơn so với phương thức tôi cần gọi

T InterfaceMethod<T>(); 

T không có ràng buộc. Trong mã của tôi, tôi cần phải gọi một phương thức từ một thư viện của bên thứ 3 khác nhau, với một chữ ký phương pháp

T AnotherMethod<T>() where T: class; 

Các loại T là đáng kể đối với logic của AnotherMethod. Có cách nào để gọi AnotherMethod<T>() trong quá trình triển khai của tôi mà không sử dụng phản ánh không? Tôi rõ ràng cần thực hiện hành động thay thế nếu T là loại giá trị. Có lẽ một cách để autobox để làm việc xung quanh này?

+0

gì AnotherMethod () làm với T? Nếu bạn muốn hộp nó, chỉ cần đúc nó cho một đối tượng trước ..? –

+0

Không chắc chắn sẽ giúp tôi, vì tôi nhận được một lỗi biên dịch liên quan đến T cần phải là một kiểu tham chiếu. – techphoria414

Trả lời

1

Tôi không nghĩ rằng những gì bạn đang tìm kiếm là có thể mà không có sự phản ánh. Tốt nhất, bạn chỉ có thể gọi AnotherMethod<object>() và truyền kết quả. Nhưng điều này sẽ chỉ thực sự hoạt động đúng nếu T của AnotherMethod không quan trọng đối với mục đích của bạn.

+0

Có vẻ như trong trường hợp của tôi, bạn đã đúng. – techphoria414

2

Tôi không chắc chắn đây là chính xác những gì bạn cần, nhưng điều này cho phép bạn gọi AnotherMethod từ InterfaceMethod mà không cần sử dụng sự phản chiếu. Nó vẫn sử dụng một Convert.ChangeType mặc dù.

Ý tưởng là thực hiện việc triển khai lớp chung với một hạn chế (tại đây là Tin). Sau đó, bạn chuyển đổi loại T không bị giới hạn của InterfaceMethod thành Tin. Cuối cùng, bạn có thể gọi phương thức AnotherMethod với kiểu ràng buộc. Sau đây hoạt động tốt với chuỗi.

public interface ITest 
{ 
    T InterfaceMethod<T> (T arg); 
} 

public interface ITest2 
{ 
    U AnotherMethod<U>(U arg) where U : class; 
} 

public class Test<Tin> : ITest, ITest2 where Tin : class 
{ 
    public T InterfaceMethod<T> (T arg) 
    { 
     Tin argU = arg as Tin; 
     if (argU != null) 
     { 
      Tin resultU = AnotherMethod(argU); 
      T resultT = (T)Convert.ChangeType(resultU,typeof(T)); 
      return resultT; 
     } 
     return default(T); 
    } 

    public U AnotherMethod<U> (U arg) where U : class { return arg; } 
} 
+0

+1 cho sự khéo léo nhưng không may với cách lớp của tôi cần được khởi tạo bởi Unity trong mã khung công tác, tôi không thể sử dụng Generics trên chính lớp đó. Đã chỉnh sửa câu hỏi của tôi để làm rõ tình hình một chút. Chắc chắn có thể làm việc cho một người mà họ có khả năng chỉ định khi khởi tạo lớp. – techphoria414

0

gì người khác đang nói là bạn có thể đi qua đối tượng như thế này:

public interface ITest 
{ 
    T InterfaceMethod<T>(T arg); 
} 

public interface IAnotherTest 
{ 
    U AnotherMethod<U>(U arg) where U : class; 
} 

public class Test : ITest 
{ 
    private IAnotherTest _ianothertest; 

    public T InterfaceMethod<T>(T arg) 
    { 
     object argU = arg as object; 
     if (argU != null) 
     { 
      object resultU = _ianothertest.AnotherMethod(argU); 
      T resultT = (T)Convert.ChangeType(resultU, typeof(T)); 
      return resultT; 
     } 
     return default(T); 
    } 
} 
+0

Vì Tim S chỉ ra điều này chỉ hoạt động nếu loại T không quan trọng đối với phương thức được gọi. Tiếc là nó. – techphoria414

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