मेरे पास निम्न परिदृश्य है जहां मैं स्ट्रिंग और सामान्य प्रकार में पास करना चाहता हूं:मैं TryParse() के सामान्य संस्करण में किसी विशिष्ट प्रकार में कैसे परिवर्तित कर सकता हूं?
public class Worker {
public void DoSomeWork<T>(string value)
where T : struct, IComparable<T>, IEquatable<T> { ... }
}
जिस तरह से मुझे स्ट्रिंग मान को अपने T
मान में परिवर्तित करने की आवश्यकता है। लेकिन मैं सीधे कन्वर्ट नहीं करना चाहता क्योंकि मुझे कुछ तर्क करने की ज़रूरत है यदि स्ट्रिंग को T
प्रकार में परिवर्तित नहीं किया जा सकता है।
मैं सोच रहा था कि मैं Convert.ChangeType()
का उपयोग करने का प्रयास कर सकता हूं लेकिन इसमें समस्या है कि अगर यह परिवर्तित नहीं होता है तो यह एक अपवाद फेंक देगा और मैं DoSomeWork()
विधि को अक्सर चलाने के लिए पर्याप्त प्रयास नहीं करूँगा यह निर्धारित करने के लिए कि रूपांतरण मान्य है या नहीं।
तो यह मुझे सोचने लगा, मुझे पता है कि मैं संख्यात्मक प्रकारों के साथ काम कर रहा हूं, इसलिए टी निम्न में से कोई भी होगा: int
, uint
, short
, ushort
, long
, ulong
, byte
, sbyte
, decimal
, float
, double
। यह जानकर मैंने सोचा कि इस तथ्य के साथ काम करने के लिए एक तेज़ समाधान के साथ आना संभव हो सकता है कि मुझे पता है कि मैं संख्यात्मक प्रकारों का उपयोग करूँगा (ध्यान दें कि T
एक संख्यात्मक प्रकार नहीं है जिसे मैंने अपवाद फेंक दिया है) ...
public class NumericWorker {
public void DoSomeWork<T>(string value)
where T : struct, IComparable<T>, IEquatable<T>
{
ParseDelegate<T> tryConverter =
SafeConvert.RetreiveNumericTryParseDelegate<T>();
...
}
}
public class SafeConvert
{
public delegate bool ParseDelegate<T>(string value, out T result);
public static ParseDelegate<T> RetreiveNumericTryParseDelegate<T>()
where T : struct, IComparable<T>, IEquatable<T>
{
ParseDelegate<T> tryParseDelegate = null;
if (typeof(T) == typeof(int))
{
tryParseDelegate = (string v, out T t) =>
{
int typedValue;
bool result = int.TryParse(v, out typedValue);
t = result ? (T)typedValue : default(T);
//(T)Convert.ChangeType(typedValue, typeof(T)) : default(T);
return result;
};
}
else if (typeof(T) == typeof(uint)) { ... }
else if (typeof(T) == typeof(short)) { ... }
else if (typeof(T) == typeof(ushort)) { ... }
else if (typeof(T) == typeof(long)) { ... }
else if (typeof(T) == typeof(ulong)) { ... }
else if (typeof(T) == typeof(byte)) { ... }
else if (typeof(T) == typeof(sbyte)) { ... }
else if (typeof(T) == typeof(decimal)) { ... }
else if (typeof(T) == typeof(float)) { ... }
else if (typeof(T) == typeof(double)) { ... }
return tryParseDelegate;
}
}
लेकिन उपर्युक्त समस्या है कि मैं t = result ? (T)typedValue : default(T);
नहीं लिख सकता क्योंकि typedValue
से T
का कास्टिंग मुद्दों का कारण बनता है और एकमात्र तरीका मैं इसके आसपास पाने में सक्षम हूं, इस प्रकार (T)Convert.ChangeType(typedValue, typeof(T))
लिख रहा है। लेकिन अगर मैं ऐसा करता हूं तो मैं बस एक और कन्वर्ट कर रहा हूं।
इसलिए मैं सोच रहा था कि अगर कोई जानता है कि मैं इस समस्या को कैसे ठीक कर सकता हूं (यदि आपको लगता है कि ChangeType()
करना कोई समस्या है) या यदि कोई बेहतर समाधान है तो मैंने पूरी तरह से विचार नहीं किया है।
क्या मैं के लिए उपयोगकर्ता इनपुट को मान्य है यह उपयोग कर रहा हूँ ... :(तो thats क्यों मैं changetype पकड़ का उपयोग करें और प्रयास करने के लिए/क्योंकि नहीं करना चाहता था कौन जानता है कि उपयोगकर्ता क्या टाइप करेगा ... –
हे, ठीक है :-) एफडब्ल्यूआईडब्ल्यू, मैं 'चेंज टाइप()' द्वारा फेंकने वाले अपवादों को पकड़ने के दक्षता पहलू के बारे में ज्यादा चिंता नहीं करता, लेकिन यदि आप चिंतित हैं स्टाइल तो आपका समाधान ठीक दिखता है। ध्यान दें कि आप शायद इसे एक सामान्य जेनेरिक विधि में उबलकर एपीआई कर सकते हैं, जहां टी को 'आउट' पैरामीटर द्वारा स्पष्ट रूप से निर्दिष्ट किया गया है। – Shog9
मैं सब सादगी के लिए हूं, आपका मतलब क्या है "जहां टी को आउट पैरामीटर द्वारा स्पष्ट रूप से निर्दिष्ट किया गया है" ?? –