मैं इस हों:.NET में जेनेरिक प्रकार के मूल नाम को प्राप्त करने का सही तरीका सबस्ट्रिंग के माध्यम से है?
Type t = typeof(Dictionary<String, String>);
मैं कैसे एक स्ट्रिंग के रूप "System.Collections.Generic.Dictionary"
मिलता है? यह करने का सबसे अच्छा/एकमात्र तरीका है:
String n = t.FullName.Substring(0, t.FullName.IndexOf("`"));
हालांकि मुझे थोड़ी सी हैकिश लगता है।
कारण मुझे यह चाहिए कि मैं Type
ऑब्जेक्ट लेना चाहता हूं, और सी # स्रोत कोड फ़ाइल में पाए गए कोड के समान कोड उत्पन्न करना चाहता हूं। मैं कुछ पाठ टेम्पलेट्स उत्पादन कर रहा हूँ, और मैं स्रोत में तारों के रूप में प्रकार जोड़ने की आवश्यकता है, और FullName
संपत्ति कुछ इस तरह का उत्पादन:
System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089]]
बजाय मैं क्या चाहते हैं की
:
System.Collections.Generic.Dictionary<System.String, System.String>
संपादित: ठीक है, यहाँ अंतिम कोड है, अभी भी मेरे लिए एक हैक की तरह एक सा लगता है, लेकिन यह काम करता है:
/// <summary>
/// This method takes a type and produces a proper full type name for it, expanding generics properly.
/// </summary>
/// <param name="type">
/// The type to produce the full type name for.
/// </param>
/// <returns>
/// The type name for <paramref name="type"/> as a string.
/// </returns>
/// <exception cref="ArgumentNullException">
/// <para><paramref name="type"/> is <c>null</c>.</para>
/// </exception>
public static String TypeToString(Type type)
{
#region Parameter Validation
if (Object.ReferenceEquals(null, type))
throw new ArgumentNullException("type");
#endregion
if (type.IsGenericType)
{
if (type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
Type underlyingType = type.GetGenericArguments()[0];
return String.Format("{0}?", TypeToString(underlyingType));
}
String baseName = type.FullName.Substring(0, type.FullName.IndexOf("`"));
return baseName + "<" + String.Join(", ", (from paramType in type.GetGenericArguments()
select TypeToString(paramType)).ToArray()) + ">";
}
else
{
return type.FullName;
}
}
सही है, लेकिन है एक ही तरीका है, में प्रयोग करने से सामान्य हिस्सा पहले नाम का भाग प्राप्त करने के लिए के रूप में मैं पता चला , या वहाँ एक साफ-सुथरा प्रतिबिंब-रास्ता है, एक संपत्ति या विधि जिसके बारे में मुझे नहीं पता? –
जैसा कि जोहान्सएच अपने जवाब में बताता है, आप जो देखते हैं वह आईएल नोटेशन है। अगर आप कुछ और चाहते हैं (जैसे सी #) तो आपको इसे स्वयं मैप करना होगा। हमारे पास कुछ इन-हाउस टूल्स हैं जो आप जो सुझाव दे रहे हैं उसके समान कुछ करते हैं। मुझे सी # सिंटैक्स प्राप्त करने के किसी अन्य तरीके से अवगत नहीं है, लेकिन दूसरी तरफ मैं प्रारूप को तय करने के लिए मानता हूं और इस प्रकार आप इसे सुरक्षित रूप से स्वयं को बदलने में सक्षम होना चाहिए। –