2013-07-23 27 views
5

Vì vậy, tôi có một chất kết dính mô hình chung tùy chỉnh, xử lý cả T và Nullable <T>.
Nhưng tôi tự động tạo các ràng buộc thông qua sự phản chiếu. Tôi tìm kiếm trhough toàn bộ appdomain đếm gắn cờ với thuộc tính cụ thể và tôi muốn để ràng buộc theese enums như thế này:Quấn T trong Nullable <T> qua Reflection

AppDomain 
    .CurrentDomain 
    .GetAssemblies() 
    .SelectMany(asm => asm.GetTypes()) 
    .Where(
     t => 
     t.IsEnum && 
     t.IsDefined(commandAttributeType, true) && 
     !ModelBinders.Binders.ContainsKey(t)) 
    .ToList() 
    .ForEach(t => 
    { 
     ModelBinders.Binders.Add(t, new CommandModelBinder(t)); 
     //the nullable version should go here 
    }); 

Nhưng đây là việc nắm bắt. Tôi không thể liên kết Nullable <T> với CommandModelBinder.
Tôi đang nghĩ đến việc tạo mã thời gian chạy, nhưng tôi không bao giờ làm điều này và có thể có các tùy chọn khác trên thị trường. Bất kỳ ý tưởng nào để đạt được điều này?

Cảm ơn,
Péter

Trả lời

8

Nếu bạn đã có T, bạn có thể tạo Nullable<T> sử dụng Type.MakeGenericType:

ModelBinders.Binders.Add(t, new CommandModelBinder(t)); 
var n = typeof(Nullable<>).MakeGenericType(t); 
ModelBinders.Binders.Add(n, new CommandModelBinder(n)); 

Tôi không biết làm thế nào CommandModelBinder công trình của bạn và những gì đối số nhà xây dựng thích hợp là , bạn có thể cần

ModelBinders.Binders.Add(n, new CommandModelBinder(t)); 

thay thế.

Lưu ý: MakeGenericType sẽ ném một ngoại lệ nếu được gọi với loại sai. Tôi chưa thêm kiểm tra lỗi, vì bạn đã lọc để chỉ nhận được các loại mà điều này có ý nghĩa. Hãy ghi nhớ điều này nếu bạn thay đổi lọc của mình.

+0

Cảm ơn câu trả lời và mẹo giới thiệu về lọc. Tôi giả sử nó hoạt động như tôi đã mã hóa nó, vì vậy nếu có một hạn chế hoặc nếu chúng ta không chuyển đúng nmber của các tham số chung thì nó sẽ ném một ngoại lệ. –