आप वास्तव में क्या Paw is suggesting कर सकता है, यहां तक कि एक सामान्य बाधा के साथ, आप अपने ही वर्ग के लिए इस विधि को स्थानांतरित कर सकता है:
public abstract class Helper<T>
{
public static string DoSomething<TEnum>(TEnum value) where TEnum: struct, T
{
if (!Enum.IsDefined(typeof(TEnum), value))
{
value = default(TEnum);
}
// ... do some other stuff
// just to get code to compile
return value.ToString();
}
}
public class EnumHelper : Helper<Enum> { }
तब आप क्या करेंगे, उदाहरण के लिए:
MyEnum x = MyEnum.SomeValue;
MyEnum y = (MyEnum)100; // Let's say this is undefined.
EnumHelper.DoSomething(x); // generic type of MyEnum can be inferred
EnumHelper.DoSomething(y); // same here
जैसा कि कोनराड रुडॉल्फ एक टिप्पणी में बताते हैं, उपरोक्त कोड में default(TEnum)
0 का मूल्यांकन करेगा, भले ही TEnum
प्रकार के लिए 0 के लिए मान परिभाषित किया गया हो या नहीं। यदि आप जो चाहते हैं वह नहीं है, Will's answer निश्चित रूप से परिभाषित मान ((TEnum)Enum.GetValues(typeof(TEnum)).GetValue(0)
) प्राप्त करने का सबसे आसान तरीका प्रदान करता है।
दूसरी ओर, यदि आप चरम को यह लेते हैं, और परिणाम कैश करने के लिए इतना है कि आप इसे कभी भी बॉक्स की जरूरत नहीं है चाहता हूँ, आप ऐसा कर सकता है:
public abstract class Helper<T>
{
static Dictionary<Type, T> s_defaults = new Dictionary<Type, T>();
public static string DoSomething<TEnum>(TEnum value) where TEnum: struct, T
{
if (!Enum.IsDefined(typeof(TEnum), value))
{
value = GetDefault<TEnum>();
}
// ... do some other stuff
// just to get code to compile
return value.ToString();
}
public static TEnum GetDefault<TEnum>() where TEnum : struct, T
{
T definedDefault;
if (!s_defaults.TryGetValue(typeof(TEnum), out definedDefault))
{
// This is the only time you'll have to box the defined default.
definedDefault = (T)Enum.GetValues(typeof(TEnum)).GetValue(0);
s_defaults[typeof(TEnum)] = definedDefault;
}
// Every subsequent call to GetDefault on the same TEnum type
// will unbox the same object.
return (TEnum)definedDefault;
}
}
स्रोत
2010-11-04 12:45:26
कैसे कर सकते हैं आप इस विधि को 'मान' के रूप में उसी प्रकार के मूल्य में परिभाषित किए गए 'मान' के बिना भी कॉल करते हैं? –
@Paw, इस तरह enum काम करता है। आप इंट एनम में किसी भी int मान को स्टोर कर सकते हैं, चाहे वह परिभाषित हो या नहीं। – fearofawhackplanet
@fearofawhackplanet, मैं बस यह समझने की कोशिश कर रहा हूं कि आप क्या करने की कोशिश कर रहे हैं। यदि आप एक इंट को एक enum या शायद एक स्ट्रिंग को एक enum में परिवर्तित करना चाहते हैं? –