Hạn chế struct
trên Nullable<T>
là IMHO thực sự không may. Một cái gì đó giống như một Nullable<String>
hoặc một Nullable<Nullable<Nullable<int>>>
có thể có lãng phí, nhưng vì vậy những gì? Hộp trước đây là nội dung của nó; unbox nó như là nội dung của nó và thiết lập các HasValue
nếu nội dung là không null. Hãy đặt tên cũ là int
nếu tất cả báo cáo không có giá trị HasValue
và khi hủy hộp, hãy đặt HasValue
của tất cả các mục lồng nhau nếu nội dung không phải là rỗng.
Nếu không, tôi khuyên bạn nên tạo một lớp chung tĩnh với tham số kiểu T
, trong đó có thuộc tính ủy quyền chấp nhận tham số T
làm tham số. Thuộc tính phải trả lại nội dung của trường riêng tư sẽ được khởi tạo để trỏ đến phương thức sẽ kiểm tra loại T
và đặt đại biểu thành phiên bản struct
hoặc class
nếu thích hợp.
Đây là ví dụ về những gì tôi đang nói đến; điều này sử dụng các ràng buộc giao diện khác nhau hơn là ràng buộc struct/class, nhưng các nguyên tắc tương tự có thể được sử dụng một cách hiệu quả.
static class _FooDispatcher<T>
{
public static Action<T> Foo = setupFoo;
static void doFooWithIGoodFoo<TT>(TT param) where TT : IGoodFoo
{
Console.WriteLine("Dispatching as IGoodFoo with {1} type {0}", typeof(TT).ToString(), typeof(TT).IsValueType ? "value" : "reference");
param.Foo();
}
static void doFooWithIOkayFoo<TT>(TT param) where TT : IOkayFoo
{
Console.WriteLine("Dispatching as IOkayFoo with {1} type {0}", typeof(TT).ToString(), typeof(TT).IsValueType ? "value" : "reference");
param.Foo();
}
static void doFooSomehow<TT>(TT param)
{
Console.WriteLine("Nothing exciting with {1} type {0}", typeof(TT).ToString(), typeof(TT).IsValueType ? "value" : "reference");
}
static void setupFoo(T param)
{
System.Reflection.MethodInfo mi;
if (typeof(IGoodFoo).IsAssignableFrom(typeof(T)))
mi = typeof(_FooDispatcher<T>).GetMethod("doFooWithIGoodFoo", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
else if (typeof(IOkayFoo).IsAssignableFrom(typeof(T)))
mi = typeof(_FooDispatcher<T>).GetMethod("doFooWithIOkayFoo", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
else
mi = typeof(_FooDispatcher<T>).GetMethod("doFooSomehow", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
Foo = (Action<T>)(@Delegate.CreateDelegate(typeof(Action<T>), mi.MakeGenericMethod(typeof(T))));
Foo(param);
}
}
Không quan tâm, loại trường hợp sử dụng thực tế của bạn đang cố gắng làm gì? – AakashM
@AakashM: đơn giản, tôi cần chuyển đổi các kiểu nullable theo một cách khác với các kiểu giá trị không nullable. Tôi nghĩ rằng quá tải chung là một cách nhanh chóng để sửa chữa nó. Phương thức này lấy một đối tượng và một kiểu param và tôi không thể hạn chế kiểu param (tốt, tôi có thể, nhưng tôi không thể quá tải nó). – Abel