2012-11-07 30 views
6

Tôi đang gặp sự cố (có thể do thiếu tính phổ biến của C# generics) trong việc loại bỏ loại chung chung. Tôi có một số phương pháp trông khá giống với các phương thức sau ngoại trừ giao diện xác thực rõ ràng đang được sử dụng.Lấy loại không theo kiểu chung loại đóng một loại chung

public IEnumerable<IDeleteValidator<T>> GetDeleteValidators<T>() 
{ 
    var validatorList = new List<IDeleteValidator<T>>(); 
    foreach (var type in GetRecursiveBaseTypesAndInterfaces(typeof(T))) 
    { 
     var validatorType = typeof(IDeleteValidator<>).MakeGenericType(type); 
     var validators = ObjectFactory 
      .GetAllInstances(validatorType).Cast<IDeleteValidator<T>>(); 
     validatorList.AddRange(validators); 
    } 
    return validatorList; 
} 

Phương thức GetRecursiveBaseTypesAndInterfaces làm như nó nói và tập hợp tất cả các loại cơ sở và giao diện của một loại nhất định. Vì vậy, những gì tôi đang làm là lấy loại không rõ ràng của giao diện xác nhận hợp lệ rõ ràng và nhận được kiểu của nó là đóng trên mỗi lớp và các giao diện cơ bản của kiểu T gốc. Đây hoạt động tuyệt vời, tuy nhiên tôi muốn dọn dẹp mã của tôi và thực hiện điều này trong một hình thức chung chung hơn trên

biết rằng bất kỳ validator của T sẽ mở rộng IValidator (như dưới đây)

public interface IDeleteValidator<in T> : IValidator<T> {} 

My chưa hoàn thành nỗ lực một phiên bản chung của các phương pháp trên trông giống như:

public IEnumerable<TValidator> GetValidators<T, TValidator>() 
    where TValidator : IValidator<T> 
{ 
    var validatorList = new List<TValidator>(); 
    foreach (var type in GetRecursiveBaseTypesAndInterfaces(typeof(T))) 
    { 
     var unclosedType = ??? 
     var validatorType = typeof(unclosedType).MakeGenericType(type); 
     var validators = ObjectFactory 
      .GetAllInstances(validatorType).Cast<TValidator>(); 
     validatorList.AddRange(validators); 
    } 
    return validatorList; 
} 

làm thế nào để xác định unclosedType (hoặc cơ cấu lại phương pháp) để làm công việc giống như hoặc phương pháp iginal với một cuộc gọi đến

GetValidators<Whatever, IDeleteValidator<Whatever>>(); 

Hoặc có thể tinh chỉnh phương pháp của mình nhiều hơn để gọi như sau là đủ?

GetValidators<IDeleteValidator<Whatever>>(); 

Trả lời

2

tôi không khá làm theo các câu hỏi (hơn do buồn ngủ của tôi hơn bất cứ thứ gì), nhưng bạn có sau:

var unclosedTyped = type.GetGenericTypeDefinition(); 

? (Xem số docs để biết chi tiết.)

+0

Điều đó giải quyết được vấn đề chính xác. Cảm ơn. – rheone

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