2013-07-23 11 views
6

क्या अज्ञात वर्ग में अतिरिक्त गुण जोड़ने के लिए कोई तरीका है (या अतिरिक्त गुणों के साथ एक नया उदाहरण बनाएं)?किसी अज्ञात वर्ग में अतिरिक्त गुण जोड़ना

string cssClasses = "hide"; 
object viewData = new { @class = cssClasses }; 
if (suppliedId != null) 
{ 
    // add an extra id property to the viewData somehow... 
    // desired end result is { @id = suppliedId, @class = cssClasses } 
} 
// ... code will be passing the viewData as the additionalViewData parameter in asp.mvc's .EditorFor method 

उत्तर

1

पेट्रिक से एक टिप्पणी के लिए धन्यवाद मैं इसे जाने एक ExpandoObject का उपयोग कर दिया और इसे इस तरह से काम कर रहा गया: अंतिम पंक्ति यह MVC में काम कर रही है ताकि यह भी भेजी जा सकती करने के लिए महत्वपूर्ण था

dynamic viewData = new ExpandoObject(); 
[email protected] = cssClasses; 
if (controlId != null) 
    viewData.id = controlId; 
if (title != null) 
    viewData.title = title; 
// put the result into a route value dictionary so that MVC's EditorFor (etc) can interpret it 
var additionalViewData = new RouteValueDictionary(viewData); 

कि EditorFor आदि में अतिरिक्त दृश्य दृश्य पैरामीटर के रूप में

ऐसी परिस्थितियों में जहां मुझे अज्ञात वर्ग पारित किया जा रहा है और इसे स्वयं जोड़ने की आवश्यकता है, मैं प्रतिबिंब (और ExpandoObject कार्यान्वयन IDictionary का लाभ ले रहा हूं) का उपयोग कर रहा हूं। यहाँ इकाई परीक्षण मुझे लगता है कि यह काम करता है की जाँच करने के लिए लिखा था है:

[TestMethod] 
public void ShouldBeAbleToConvertAnAnonymousObjectToAnExpandoObject() 
{ 
    var additionalViewData = new {id = "myControlId", css = "hide well"}; 
    dynamic result = new ExpandoObject(); 
    var dict = (IDictionary<string, object>)result; 
    foreach (PropertyInfo propertyInfo in additionalViewData.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) 
    { 
    dict[propertyInfo.Name] = propertyInfo.GetValue(additionalViewData, null); 
    } 
    Assert.AreEqual(result.id, "myControlId"); 
    Assert.AreEqual(result.css, "hide well"); 
} 
6

नहीं, आप इसे नहीं कर सकते हैं। तुम्हें पता है, यह फिर से परिभाषित कर सकते हैं, हालांकि:

dynamic viewData = new { @class = cssClasses }; 
if (suppliedId != null) 
{ 
    viewData = new { @class = [email protected], yourExtra = Property }; 
} 

ध्यान दें कि मैं इसे dynamic को बदल दिया है। यह सिर्फ इतना है कि आप dynamic पर कास्टिंग किए बिना गुणों को संपादित कर सकते हैं।

+3

हाँ, या तो है कि या का उपयोग 'साथ dynamic'' ExpandoObject' बजाय :) –

+0

@ PatrykĆwiek हाँ, सच। मुझे ExpandoObject tbh पसंद है, यह बहुत अच्छा है। –

+0

मुझे समझ में नहीं आता कि आपने कोड में 'ऑब्जेक्ट' क्यों नहीं रखा? प्रश्न में दोनों गुमनाम प्रकार 'ऑब्जेक्ट' हैं। –

2

आप अज्ञात प्रकारों में अतिरिक्त गुण नहीं जोड़ सकते हैं, लेकिन आप दो अज्ञात प्रकारों का उपयोग कर सकते हैं।

आप dynamic पसंद नहीं आता तो (और वहाँ कारणों नहीं करने के लिए कर रहे हैं), तुम कर सकते हो:

object viewData; 
if (suppliedId == null) 
    viewData = new { @class = cssClasses, }; 
else 
    viewData = new { @id = suppliedId, @class = cssClasses, }; 

आप प्रत्येक के लिए अलग वास्तव में आपके द्वारा लिखे गए संदर्भ रखना चाहते हैं उदाहरण आपत्ति है, तो का उपयोग करें:

var viewDataSimple = new { @class = cssClasses, }; 
var viewDataExtra = new { @id = suppliedId, @class = cssClasses, }; 
object viewDataToUse; 
if (suppliedId == null) 
    viewDataToUse = viewDataSimple; 
else 
    viewDataToUse = viewDataExtra; 

इसके बजाए।

+0

+1 हाँ, यह वही है जो मैं कर रहा था। अब मुझे कुछ अतिरिक्त गुण मिल गए हैं, इसलिए क्रमपरिवर्तन की संख्या हाथ से बाहर हो रही है। –

+0

@ जोनाथनमोफैट तो शायद आप वास्तव में [सिस्टम ''ExpandoObject' वर्ग] (http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx) को सिस्टम में चाहते हैं।गतिशील 'नामस्थान। जब आप जाते हैं तो नए सदस्यों को जोड़कर यह वास्तव में काम करता है। मैंने दिए गए लिंक पर उदाहरण देखें। संपादित करें: आह, बस आपके नए उत्तर से देखा गया है कि आप पहले से ही पता चला है। –

0

आप प्रतिबिंब का उपयोग करके आवश्यकता प्राप्त कर सकते हैं, आप KeyValue जोड़ी से नई संपत्ति जोड़ सकते हैं।

string cssClasses = "hide"; 
     object viewData = new { @class = cssClasses }; 
     dynamic expandoData = new ExpandoObject(); 
     var processedData = expandoData as IDictionary<String, object>; 
     if (viewData != null) 
     { 
      PropertyInfo[] properties = viewData.GetType().GetProperties(); 
      foreach (var prop in properties) 
      { 
       if (prop == null) continue; 
       object valueObj = viewData .GetType().GetProperty(prop.Name).GetValue(viewData , null); 
       processedData[prop.Name.ToString()] = valueObj; 
      } 
     }   
     processedData["AdditionalPropertyName"] = AdditionalProperty; 
     var infoJson = JsonConvert.SerializeObject(processedData); 
+0

आपको अब जो समाधान दिया गया है उसका वर्णन करना चाहिए, यह केवल एक अंतर है - उचित उत्तर नहीं – DomTomCat

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