2012-01-16 13 views
14

tôi có một giao diện chung như thế này:Nhận Loại Giao diện chung?

public interface IResourceDataType<T> 
{ 
    void SetResourceValue(T resValue); 
} 

Sau đó, tôi nhận được lớp này mà thực hiện giao diện của tôi:

public class MyFont : IResourceDataType<System.Drawing.Font> 
{ 
    //Ctor + SetResourceValue + ... 
} 

Và cuối cùng tôi nhận được:

var MyType = typeof(MyFont); 

tôi, bây giờ , muốn lấy loại System.Drawing.Font từ MyType! Tại thời điểm này, tôi có mã này:

if (typeof(IResourceDataType).IsAssignableFrom(MyType)) 
{ 
    //If test is OK 
} 

Nhưng tôi không quản lý để "giải nén" Kiểu của tôi ở đây ... Tôi đã thử một vài điều với GetGenericArguments() và những thứ khác nhưng họ hoặc don' t biên dịch hoặc trả lại giá trị null/Danh sách ... Tôi phải làm gì?

EDIT: Dưới đây là giải pháp phù hợp với mã của tôi đối với những người sẽ nhận được cùng một vấn đề:

if (typeof(IResourceDataType).IsAssignableFrom(MyType)) 
{ 
    foreach (Type type in MyType.GetInterfaces()) 
    { 
     if (type.IsGenericType) 
      Type genericType = type.GetGenericArguments()[0]; 
     } 
    } 
} 
+0

Bạn đã xem bài đăng này: http://stackoverflow.com/questions/557340/c-sharp-generic-list-t-how-to-get-the-type-of-t –

+0

Đúng, và một vài của những người khác, họ không trả lời câu hỏi của tôi ... Cảm giác của tôi là tôi phải sử dụng GetInterfaces() và làm một số thứ khác, tôi thực sự đang cố gắng! –

Trả lời

10

Kể từ lớp MyFont của bạn chỉ thực hiện một giao diện, bạn có thể viết:

Type myType = typeof(MyFont).GetInterfaces()[0].GetGenericArguments()[0]; 

Nếu lớp học của bạn triển khai một số giao diện, bạn có thể gọi phương thức GetInterface() với tên bị xiên của giao diện bạn đang tìm kiếm:

Type myType = typeof(MyFont).GetInterface("IResourceDataType`1") 
          .GetGenericArguments()[0]; 
+0

Đó là những gì tôi đang cố gắng, nhưng tôi thực hiện đa giao diện, đó chỉ là một đoạn trích để phơi bày vấn đề của tôi! –

+0

Tôi sẽ "EDIT" với giải pháp cuối cùng, tôi gần với nó –

+0

Bạn sẽ phải sử dụng 'GetInterface()' sau đó, xem câu trả lời cập nhật của tôi. –

1
var fontTypeParam = typeof(MyFont).GetInterfaces() 
    .Where(i => i.IsGenericType) 
    .Where(i => i.GetGenericTypeDefinition() == typeof(IResourceDataType<>)) 
    .Select(i => i.GetGenericArguments().First()) 
    .First() 
    ; 

Điều này sẽ giúp bạn quan tâm đến việc đổi tên giao diện. Không có chuỗi chữ, do đó, một đổi tên trong Visual Studio nên cập nhật biểu thức tìm kiếm của bạn.

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