Nullable<T>
पर बाधा आईएमएचओ वास्तव में दुर्भाग्यपूर्ण है। Nullable<String>
या Nullable<Nullable<Nullable<int>>>
की तरह कुछ अपमानजनक हो सकता है, लेकिन क्या? पूर्व को अपनी सामग्री के रूप में बॉक्स करें; इसे सामग्री के रूप में अनबॉक्स करें और HasValue
सेट करें यदि सामग्री गैर-शून्य है। int
के रूप में पूर्व को बॉक्स करें यदि सभी nullables HasValue
रिपोर्ट करते हैं, और जब अनबॉक्सिंग करते हैं, तो सभी नेस्टेड आइटमों के HasValue
सेट करें यदि सामग्री गैर-शून्य थी।
अन्यथा, मैं सुझाव दूंगा कि आप टाइप पैरामीटर T
के साथ एक स्थैतिक जेनेरिक क्लास बनाएं जिसमें एक प्रतिनिधि संपत्ति है जो T
पैरामीटर के रूप में स्वीकार करती है। संपत्ति को एक निजी क्षेत्र की सामग्री वापस करनी चाहिए जिसे एक विधि को इंगित करने के लिए प्रारंभ किया जाना चाहिए जो T
के प्रकार की जांच करेगा और प्रतिनिधि को struct
या class
संस्करण पर उचित रूप से सेट करेगा।
यहां मैं जो बात कर रहा हूं उसका एक नमूना है; यह संरचना/वर्ग की बाधाओं के बजाए विभिन्न इंटरफ़ेस बाधाओं का उपयोग करता है, लेकिन समान सिद्धांतों का प्रभावी ढंग से उपयोग किया जा सकता है।
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);
}
}
ब्याज से, आपका वास्तविक उपयोग केस किस प्रकार की कोशिश कर रहा था? – AakashM
@AakashM: सरल, मुझे गैर-शून्य मूल्य प्रकारों की तुलना में एक अलग तरीके से निरर्थक प्रकारों को परिवर्तित करने की आवश्यकता थी। मैंने सोचा कि एक सामान्य अधिभार इसे ठीक करने का एक त्वरित तरीका था। विधि एक ऑब्जेक्ट और एक प्रकार का param लेता है और मैं प्रकार param को प्रतिबंधित नहीं कर सकता (ठीक है, मैं कर सकता हूं, लेकिन मैं इसे अधिभारित नहीं कर सकता)। – Abel