2011-01-15 11 views
6

सी # में, मुझे स्ट्रिंग के रूप में फ़ंक्शन में पास किए गए डेटा प्रकारों की कॉमा-सीमांकित सूची के आधार पर रन-टाइम पर टाइप ऑब्जेक्ट्स की एक सरणी बनाने में सक्षम होना चाहिए। असल में, यहाँ है कि मैं क्या पूरा करने के लिए कोशिश कर रहा हूँ है:डायनामिक रूप से टाइप इन सी #

// create array of types 
Type[] paramTypes = { typeof(uint), typeof(string), typeof(string), typeof(uint) }; 

लेकिन मैं इस तरह मेरी समारोह कॉल करने के लिए सक्षम होना चाहिए:

MyFunction("uint, string, string, uint"); 

और यह स्ट्रिंग पारित कर के आधार पर डायनामिक सरणी उत्पन्न किया है में। मेरा पहला प्रयास था:

void MyFunction(string dataTypes) 
{ 
    //out or in parameters of your function. 
    char[] charSeparators = new char[] {',', ' '}; 
    string[] types = dataTypes.Split(charSeparators, 
         stringSplitOptions.RemoveEmptyEntries); 

    // create a list of data types for each argument 
    List<Type> listTypes = new List<Type>(); 
    foreach (string t in types) 
    { 
     listTypes.Add(Type.GetType(t)); 
    } 
    // convert the list to an array 
    Type [] paramTypes = listTypes.ToArray<Type>(); 

} 

यह कोड बस सिस्टम प्रकार की शून्य वस्तुओं की एक सरणी बनाता है। टाइप करें। मुझे पूरा यकीन है कि समस्या यहां निहित है:

listTypes.Add(Type.GetType(t)); 

सुझाव यह सिंटैक्स चाल क्यों नहीं करता है?

+1

आपको यह C# -aliases तालिका 'स्विच' कथन या इसी तरह के लिए उपयोगी मिल सकती है। http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx – Ani

+0

असेंबलीनाम-मुद्दे में जोड़ने के लिए, 'Type.GetType' के अधिभारित संस्करण का उपयोग करने पर विचार करें जो मामले को अनदेखा करता है। –

उत्तर

4

समस्या .NET में कोई uint और string प्रकार देखते हैं कि है। वे वास्तविक System.UInt32 और System.String प्रकारों के लिए सी # प्रकार उपनाम हैं। तो अगर आप इस तरह अपने कार्य बुलाना चाहिए:

MyFunction("System.UInt32, System.String, System.String, System.UInt32"); 
5

System.String, System.Int32string और int के बजाय System.Int32 में पास करें।

"स्ट्रिंग" सिस्टम के लिए सिर्फ लघुरूप है। स्ट्रिंग। Type.GetType प्रकारों के लिए शॉर्टेंड नोटेशन स्वीकार नहीं करेगा।

+0

धन्यवाद! वह चाल है! – acordner

3

नामस्थान समेत प्रत्येक प्रकार के लिए पूर्ण नाम का उपयोग करें। इसलिए जैसा:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dataTypes = "System.UInt32, System.String, System.String, System.UInt32"; 

     //out or in parameters of your function. 
     char[] charSeparators = new char[] { ',', ' ' }; 
     string[] types = dataTypes.Split(charSeparators, 
          StringSplitOptions.RemoveEmptyEntries); 

     // create a list of data types for each argument 
     List<Type> listTypes = new List<Type>(); 
     foreach (string t in types) 
     { 
      listTypes.Add(Type.GetType(t)); 
     } 
     // convert the list to an array 
     Type[] paramTypes = listTypes.ToArray<Type>(); 
    } 
} 
1

यह क्योंकि uint, string, आदि .net प्रकार के आधिकारिक नाम नहीं हैं काम नहीं करता। वे System.UInt32, System.String आदि के लिए सी # उपनाम हैं। यदि आप गतिशील रूप से प्रकार बनाना चाहते हैं तो आपको .net प्रकार के नामों का उपयोग करने की आवश्यकता होगी।

संबंधित मुद्दे