2012-05-30 3 views
12

में एक तर्क के रूप में अज्ञात ऑब्जेक्ट को पास करना मुझे किसी विधि में किसी अज्ञात ऑब्जेक्ट को तर्क के रूप में गुजरने में कोई समस्या है। मैं ऑब्जेक्ट को जावास्क्रिप्ट में पास करना चाहता हूं। उदाहरण:सी #

class Test 
{ 
    public static string TestMethod(IEnumerable<dynamic> obj) 
    { 
     return obj.txt; 
    } 
} 
Console.WriteLine(Test.TestMethod(new { txt = "test" })); 

अपवाद::

  1. तर्क 1: से 'AnonymousType # 1' को परिवर्तित नहीं कर सकते 'System.Collections

    function Test(obj) { 
        return obj.txt; 
    } 
    console.log(Test({ txt: "test"})); 
    

    लेकिन सी # में, यह कई अपवाद फेंकता .Generic.IEnumerable '

  2. ' कंसोल अनुप्रयोग 1.Test.TestMethod (System.Collect के लिए सबसे अच्छा ओवरलोडेड विधि मिलान ions.Generic.IEnumerable) System.Collections.Generic.IEnumerable ' कुछ अमान्य तर्क
  3. है' txt 'और कोई विस्तार विधि' txt 'प्रकार का पहला तर्क को स्वीकार करने' 'के लिए एक परिभाषा शामिल नहीं है' सिस्टम .Collections.Generic.IEnumerable ' पाया जा सकता है (यदि आप एक का उपयोग कर के निर्देश या एक विधानसभा संदर्भ याद कर रहे हैं?)
+2

क्यों आप एक विधि IEnumerable चाहता है कि करने के लिए एक गुमनाम वस्तु से गुजर रहे हैं? इसे केवल 'गतिशील' – GregRos

+0

@GregRos स्वीकार करता है, धन्यवाद, मैं दृढ़ता से टाइप की गई भाषाओं में नया हूं और मेरे शोध मुझे यह दिखाते हैं ... – user1091156

उत्तर

17

ऐसा लगता है कि चाहते हैं:

class Test 
{ 
    public static string TestMethod(dynamic obj) 
    { 
     return obj.txt; 
    } 
} 

आप के रूप में यह प्रयोग कर रहे हैं अगर यह एक सी है एक अनुक्रम नहीं, नल मान। क्या आप वास्तव में एक अनुक्रम चाहते हैं?

3

यह काम करता है ठीक :)

public class Program 
{ 
    private static void Main(string[] args) 
    { 
     Console.WriteLine(Test.TestMethod(new[] {new {txt = "test"}})); 
     Console.ReadLine(); 
    } 
} 

public class Test 
{ 
    public static string TestMethod(IEnumerable<dynamic> obj) 
    { 
     return obj.Select(o => o.txt).FirstOrDefault(); 
    } 
} 
+0

धन्यवाद, सही काम करता है। मैं सिर्फ इस बात पर चौंक गया हूं कि एक चीज़ लिखने के लिए कितने विकल्प हैं :) – user1091156

+0

यदि आप पहले आइटम को पकड़ने जा रहे हैं तो पहली जगह में एक संख्यात्मक क्यों लें? – Servy

+0

@ सर्वी बस एक पर्यवेक्षक यहां इस पर ठोकर खा रहा है लेकिन यह सिर्फ एक परीक्षण है; कोई फर्क नहीं पड़ता कि। आईएमओ आईनेमरेबल के साथ परीक्षण करना अच्छा है क्योंकि यह नए [] {new {..}} का उपयोग करने के वाक्यविन्यास सम्मेलन को साबित करता है, जो कि सेट में गुमनाम वस्तुएं अक्सर पारित होती हैं। वास्तव में मुझे यह देखने की ज़रूरत है; मैं इसे 'पैरा' परम के रूप में उपयोग कर रहा हूं। –

8

यह यह करना चाहिए ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     var test = new { Text = "test", Slab = "slab"}; 
     Console.WriteLine(test.Text); //outputs test 
     Console.WriteLine(TestMethod(test)); //outputs test 
    } 

    static string TestMethod(dynamic obj) 
    { 
     return obj.Text; 
    } 
}