मुझे इस तरह कुछ चाहिए और मैंने आवश्यक सामान्य प्रकार के नामों को पार्स करने के लिए कुछ कोड लिखना समाप्त कर दिया। बेशक इसमें सुधार के लिए जगह है, क्योंकि यह List<string>
जैसे सामान्य प्रकार के नामों की पहचान नहीं करेगा, लेकिन यह string
, int[]
, decimal?
और इस तरह के लिए ठीक है। अगर किसी को भी मदद मिलती है तो साझा करना।
public static class TypeExtensions
{
public static Type GetTypeFromSimpleName(string typeName)
{
if (typeName == null)
throw new ArgumentNullException("typeName");
bool isArray = false, isNullable = false;
if (typeName.IndexOf("[]") != -1)
{
isArray = true;
typeName = typeName.Remove(typeName.IndexOf("[]"), 2);
}
if (typeName.IndexOf("?") != -1)
{
isNullable = true;
typeName = typeName.Remove(typeName.IndexOf("?"), 1);
}
typeName = typeName.ToLower();
string parsedTypeName = null;
switch (typeName)
{
case "bool":
case "boolean":
parsedTypeName = "System.Boolean";
break;
case "byte":
parsedTypeName = "System.Byte";
break;
case "char":
parsedTypeName = "System.Char";
break;
case "datetime":
parsedTypeName = "System.DateTime";
break;
case "datetimeoffset":
parsedTypeName = "System.DateTimeOffset";
break;
case "decimal":
parsedTypeName = "System.Decimal";
break;
case "double":
parsedTypeName = "System.Double";
break;
case "float":
parsedTypeName = "System.Single";
break;
case "int16":
case "short":
parsedTypeName = "System.Int16";
break;
case "int32":
case "int":
parsedTypeName = "System.Int32";
break;
case "int64":
case "long":
parsedTypeName = "System.Int64";
break;
case "object":
parsedTypeName = "System.Object";
break;
case "sbyte":
parsedTypeName = "System.SByte";
break;
case "string":
parsedTypeName = "System.String";
break;
case "timespan":
parsedTypeName = "System.TimeSpan";
break;
case "uint16":
case "ushort":
parsedTypeName = "System.UInt16";
break;
case "uint32":
case "uint":
parsedTypeName = "System.UInt32";
break;
case "uint64":
case "ulong":
parsedTypeName = "System.UInt64";
break;
}
if (parsedTypeName != null)
{
if (isArray)
parsedTypeName = parsedTypeName + "[]";
if (isNullable)
parsedTypeName = String.Concat("System.Nullable`1[", parsedTypeName, "]");
}
else
parsedTypeName = typeName;
// Expected to throw an exception in case the type has not been recognized.
return Type.GetType(parsedTypeName);
}
}
इसका इस्तेमाल करते हुए इस लेखन के रूप में सरल है:
Type t;
t = TypeExtensions.GetTypeFromSimpleName("string");
t = TypeExtensions.GetTypeFromSimpleName("int[]");
t = TypeExtensions.GetTypeFromSimpleName("decimal?");
स्रोत
2011-02-09 14:00:31
+1 - महान जवाब, धन्यवाद! मैं जेनेरिकों को संभालने का तरीका जानने के लिए चारों ओर झुका रहा था! –
धन्यवाद। यह काम करता है और मुझे इस तरह स्ट्रिंग को प्रारूपित करने के लिए कोड को संशोधित करना होगा। हालांकि, यह सोच रहा था कि अभी भी उपयोग करने का कोई तरीका है: "MyClass" टाइप उदाहरण प्राप्त करने के लिए स्ट्रिंग में बिल्कुल दिखाया गया है। बहुत साफ दिखता है। –
DeeStackOverflow
आपको स्ट्रिंग को इस तरह से प्रारूपित करने के लिए कोड को संशोधित करने की आवश्यकता नहीं है, बस टाइप पर ToString() पर कॉल करें। –