@ एक RouteValueDictionary
का उपयोग करने का GWB के सुझाव पर बिल्डिंग, मैं इस पुनरावर्ती क्रिया नेस्टेड गुमनाम प्रकार का समर्थन करने के लिए लिखा था, अपने माता पिता के चाबियाँ द्वारा उन नेस्टेड मापदंडों लगाकर।
public static string EncodeHtmlRequestBody(object data, string parent = null) {
var keyValuePairs = new List<string>();
var dict = new RouteValueDictionary(data);
foreach (var pair in dict) {
string key = parent == null ? pair.Key : parent + "." + pair.Key;
var type = pair.Value.GetType();
if (type.IsPrimitive || type == typeof(decimal) || type == typeof(string)) {
keyValuePairs.Add(key + "=" + Uri.EscapeDataString((string)pair.Value).Replace("%20", "+"));
} else {
keyValuePairs.Add(EncodeHtmlRequestBody(pair.Value, key));
}
}
return String.Join("&", keyValuePairs);
}
उदाहरण उपयोग:
var data = new {
apiOperation = "AUTHORIZE",
order = new {
id = "order123",
amount = "101.00",
currency = "AUD"
},
transaction = new {
id = "transaction123"
},
sourceOfFunds = new {
type = "CARD",
provided = new {
card = new {
expiry = new {
month = "1",
year = "20"
},
nameOnCard = "John Smith",
number = "4444333322221111",
securityCode = "123"
}
}
}
};
string encodedData = EncodeHtmlRequestBody(data);
encodedData
हो जाता है:
"apiOperation=AUTHORIZE&order.id=order123&order.amount=101.00&order.currency=AUD&transaction.id=transaction123&sourceOfFunds.type=CARD&sourceOfFunds.provided.card.expiry.month=1&sourceOfFunds.provided.card.expiry.year=20&sourceOfFunds.provided.card.nameOnCard=John+Smith&sourceOfFunds.provided.card.number=4444333322221111&sourceOfFunds.provided.card.securityCode=123"
आशा है कि यह एक ऐसी ही स्थिति में किसी और में मदद करता है।
संपादित करें: जैसा कि ड्र्यूजी ने बताया, यह सरणी का समर्थन नहीं करता है। अज्ञात प्रकार के साथ मनमाने ढंग से घोंसले वाले सरणी के लिए समर्थन को सही ढंग से कार्यान्वित करने के लिए गैर-तुच्छ होगा, और जैसा कि मैंने उपयोग किए गए एपीआई में से कोई भी एरे स्वीकार नहीं किया है (मुझे यकीन नहीं है कि फॉर्म एन्कोडिंग के साथ उन्हें क्रमबद्ध करने का मानकीकृत तरीका भी है) अगर आपको उनका समर्थन करने की ज़रूरत है तो मैं आपको लोगों को छोड़ दूंगा।
var dict = props.ToDictionary (x => x.Name, x => x.GetValue (a_source, null)) – Jordan
हमें यह मिला है ... हम इसे एक लाइनर बना सकते हैं: 'var dict = a .GetType()। GetProperties()। ToDictionary (x => x.Name, x => x.GetValue (ए, शून्य)); ' – kape123
@ kape123, वास्तव में।वास्तव में, नवीनतम .NET संस्करणों को अब 'ToArray()' पर कॉल की आवश्यकता नहीं है, जो कि अच्छा है। किसी भी दर पर, प्रतिक्रिया के रूप में प्रतिक्रिया शब्द के बिना SO में अच्छी तरह फिट बैठती है, इसलिए मैं इसे छोड़ दूंगा। – kbrimington