2012-05-16 10 views
8

संपादित करें: मुझे एक उत्तर मिला है (तेज से मदद के साथ); निचे देखो।मेट्रो ऐप में जावास्क्रिप्ट से सी # तक पास सरणी


मैं, HTML/जावास्क्रिप्ट का उपयोग करते हुए मेट्रो एप्लिकेशन विकसित करने कर रहा हूँ कुछ सी # हेल्पर लाइब्रेरी आधारित के साथ। आम तौर पर मुझे जावास्क्रिप्ट से सी # विधियों को कॉल करने में बहुत सफलता मिल रही है, लेकिन मुझे काम करने के लिए सरणी (मेरे विशिष्ट मामले में, तारों के सरणी) में गुजरने लगते हैं। व्यक्तिगत तारों को पारित करने के बिना काम करना।

// in javascript project 
var string1 = ...; 
var string2 = ...; 
var string3 = ...; 
var result = MyLibrary.MyNamespace.MyClass.foo([string1, string2, string3]); 

फिर, सी # में:

मेरे कोड कुछ इस तरह है

// in C# project 
public sealed class MyClass { 
    public static string Foo(string[] strings) { 
     // do stuff... 
    } 
} 

समस्या यह है कि विधि "फू" में (सही लंबाई के साथ एक सरणी हो जाता है तो है उदाहरण के ऊपर, 3), लेकिन सभी तत्व खाली हैं। मैंने यह भी कोशिश की:

public static string Foo(object[] strings) { 
... 

यह काम नहीं करता - फिर, सरणी सही आकार थी, लेकिन सभी तत्व शून्य थे।

मैंने जावास्क्रिप्ट में "नया ऐरे (...)" का उपयोग करके स्ट्रिंग अक्षर, स्ट्रिंग वेरिएबल्स को पार करने का प्रयास किया है, "फू" के हस्ताक्षर को "पैरा स्ट्रिंग []" और "पैरा ऑब्जेक्ट []" में बदलकर, सब कुछ फायदा नहीं हुआ।

व्यक्तिगत तारों को पार करने के बाद से ठीक काम करता है, इसलिए मैं शायद कुछ हैकर के साथ इस पर काम कर सकता हूं ... लेकिन ऐसा लगता है कि ऐसा काम करना चाहिए। यह वास्तव में मेरे लिए अजीब लगता है कि सरणी सही आकार के रूप में पारित की जाती है (यानी जो भी मार्शलिंग कर रहा है वह जावास्क्रिप्ट सरणी संरचना के बारे में कुछ जानता है) और फिर भी सामग्री पॉप्युलेट नहीं हो रही है।

+0

क्या होता है जब आप 'string1', 'string2', और' string3' के बदले स्ट्रिंग अक्षर का उपयोग करते हैं? – Tejs

+0

वही परिणाम - सी # कोड अभी भी खाली तार प्राप्त करता है। – atkretsch

+0

सरणी आइटम के लिए 'नई स्ट्रिंग ("हैलो वर्ल्ड") 'के बारे में क्या? शायद WinRT यह नहीं मान सकता कि ऑब्जेक्ट एक स्ट्रिंग – Tejs

उत्तर

1

चाल स्ट्रिंग [] के बजाय IEnumerable का उपयोग करना है। तो निम्नलिखित के साथ अपने मूल कोड की जगह:

public sealed class MyClass { 
    public static string Foo(IEnumerable<string> strings) { 
     // do stuff... 
    } 
} 

इसके अलावा, ध्यान दें कि IEnumerable भी काम करता है अगर तुम तार के अलावा कुछ के एरे पारित करने के लिए की जरूरत है।

प्रेरणा के लिए धन्यवाद @ टीज!

2

आपकी समस्या का समाधान बहुत आसान है, बस इसे ध्यान में रखना एक गहरी नजर है। सबसे पहले आप अपने जावास्क्रिप्ट में तो वास्तव में रखना चाहिए कि सी # (और काफी संभवतः जावास्क्रिप्ट, साथ ही) आप सरणियों की एक सरणी नहीं हो सकता है में (कम से कम पसंद नहीं आप इसे कैसे कर रहे हैं!) :

var परिणाम = MyLibrary.MyNamespace.MyClass।foo ([string1, string2, string3]);

और अपने सी # में:

सार्वजनिक स्थैतिक स्ट्रिंग फू (स्ट्रिंग [] तार) {

आप विधि फू स्ट्रिंग सरणियों के कई तर्क पारित करने की जरूरत करने जा रहे हैं है, तो जैसे:

सार्वजनिक स्थैतिक स्ट्रिंग फू (स्ट्रिंग [] string1, स्ट्रिंग [] string2, स्ट्रिंग [] string3) {

+०१२३५१६४१०

सार्वजनिक स्थैतिक स्ट्रिंग फू (सूची < स्ट्रिंग []> तार) {

:

लेकिन आप सरणियों की एक सरणी बनाना चाहते हैं, तो आप एक सूची निर्माता का उपयोग करने के लिए जा रहे हैं

लेकिन उपर्युक्त उत्तर की समस्या यह है कि जावास्क्रिप्ट में कन्स्ट्रक्टर की सूची नहीं है, इसलिए मैं पहले समाधान के साथ जाने का सुझाव दूंगा, जब तक कि आप इसे ठीक करने का कोई तरीका नहीं ढूंढ पाते!