2011-04-04 5 views
10

यहां मेरे कोड का सरलीकरण है:सी #: संग्रह को पैराम में परिवर्तित करना []

void Foo(params object[] args) 
{ 
    Bar(string.Format("Some {0} text {1} here {2}", /* I want to send args */); 
} 

string.Format को params के रूप में भेजे गए तर्कों की आवश्यकता है। क्या string.Format विधि string.Format विधि के पैरामीटर में कनवर्ट करने का कोई तरीका है?

+0

के लिए आप आर्ग के प्रकार निर्दिष्ट नहीं किया है की कोशिश कर सकते। 'पैरा स्ट्रिंग [] args होना चाहिए। इसके अलावा, आप इसे सामान्य सरणी के रूप में पास कर सकते हैं। 'पैराम्स' केवल एक कंपाइलर कीवर्ड है जो भेजे गए पैरामीटर से एक सरणी बनाता है। – HuBeZa

+0

@ हूबेज़ा: उन्होंने इस प्रकार को निर्दिष्ट किया: यह 'ऑब्जेक्ट' है। वह खुद को स्ट्रिंग पैरामीटर तक सीमित क्यों कर सकता है? – ChrisWue

+0

@ क्रिस, मेरे ब्राउज़र या मेरी आंखों के साथ कुछ गलत था। मैं कसम खाता हूँ कि यह 'शून्य फू था (पैराम्स तर्क []) '। मुझे छुट्टी की आवश्यकता है :) – HuBeZa

उत्तर

13

params कीवर्ड केवल वाक्यात्मक चीनी आप तर्क के किसी भी संख्या के साथ इस तरह के एक विधि कॉल करने की अनुमति देता है। हालांकि, उन तर्कों को हमेशा एक सरणी के रूप में विधि में पास कर दिया जाता है।

इसका मतलब है कि Foo(123, "hello", DateTime.Now)Foo(new object[] { 123, "hello", DateTime.Now }) के बराबर है।

इसलिए तर्क Foo से सीधे string.Format को इस तरह से पारित कर सकते हैं:

void Foo(params object[] args) 
{ 
    Bar(string.Format("Some {0} text {1} here {2}", args)); 
} 

हालांकि, इस विशेष मामले में, आप तीन तर्कों की मांग (क्योंकि आप {0}, {1} और {2 है } अपने प्रारूप में)। इसलिए आपको अपना कोड बदलना चाहिए:

void Foo(object arg0, object arg1, object arg2) 
{ 
    Bar(string.Format("Some {0} text {1} here {2}", arg0, arg1, arg2)); 
} 

... या मार्सेलो ने सुझाव दिया है।

4

उन्हें एक ही तर्क के रूप में पास करें:

Bar(string.Format("Some {0} text {1} here {2}", args)); 
0

आप object.GetType() का उपयोग कर उदाहरण

void Foo(params object[] args) 
    { 
     List<string> argStrings = new List<string>(); 

     foreach (object arg in args) 
     { 
      if (args.GetType().Name == typeof(String).Name) 
      { 
       argStrings.Add((string)arg); 
      } 
      else if (args.GetType().Name == typeof(DateTime).Name) 
      { 
       DateTime dateArg = (DateTime)arg; 
       argStrings.Add(dateArg.ToShortDateString()); 
      } 
      else 
      { 
       argStrings.Add(arg.ToString()); 
      } 
     } 

     Bar(string.Format("Some {0} text {1} here {2}", argStrings.ToArray())); 
    } 
+0

इसमें कुछ भी नहीं है मैंने जो पूछा उससे करो, लेकिन कोशिश करने के लिए धन्यवाद। वैसे, प्रकार के नामों की तुलना करने की कोई आवश्यकता नहीं है, आप बस 'अगर (तर्क दिनांक दिनांक) 'जांच सकते हैं। –

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

  • कोई संबंधित समस्या नहीं^_^