2012-03-20 18 views
9

के माध्यम से किसी सरणी में मूल्य निर्धारित करना सी # में प्रतिबिंब के माध्यम से सरणी संपत्ति में एकल मान सेट करने का कोई तरीका है?प्रतिबिंब

मेरी संपत्ति इस तरह परिभाषित किया गया है:

double[] Thresholds  { get; set; } 

के लिए "सामान्य" गुण मैं इस कोड का उपयोग प्रतिबिंब के माध्यम से इसे स्थापित करने के लिए:

PropertyInfo pi = myObject.GetType().GetProperty(nameOfPropertyToSet); 
pi.SetValue(myObject, Convert.ChangeType(valueToSet, pi.PropertyType), null); 

मैं किस तरह निर्धारित करने के लिए इस कोड को परिवर्तित करने के लिए होगा एक मनमानी स्थिति में एक सरणी संपत्ति में मूल्य? धन्यवाद!

Btw: मैं सूचकांक पैरामीटर का उपयोग करने की कोशिश की, लेकिन वह केवल अनुक्रमित गुण, नहीं गुण है कि सरणियों हैं के लिए काम करने के लिए ...

उत्तर

15

जब आप ऐसा करेंगे:

obj.Thresholds[i] = value; 

कि करने के लिए अर्थ की दृष्टि से बराबर है:

double[] tmp = obj.Thresholds; 
tmp[i] = value; 

जिसका अर्थ है कि आप सभी पर नहीं चाहते हैं; इसके बजाय, आप सरणी प्राप्त करने के लिए GetValue का उपयोग करना चाहते हैं, और उसके बाद सरणी को म्यूट करें। प्रकार double[], तो माना जाता है, तो:

double[] arr = (double[]) pi.GetValue(myObject, null); 
arr[i] = value; 

अन्यथा शायद गैर सामान्य IList दृष्टिकोण (के बाद से सरणियों IList लागू):

IList arr = (IList) pi.GetValue(myObject, null); 
arr[i] = value; 

यदि यह एक बहु-आयामी सरणी है, तो आप IList के स्थान पर Array का उपयोग करना होगा।

5

तुम वास्तव में, संपत्ति की स्थापना नहीं कर रहे हैं सिर्फ संपत्ति के मूल्य को बदलने लगता है:

object value = myObject.GetType().GetProperty(nameOfPropertyToset).GetValue(myObject, null); 

if (value is Array) 
{ 
    Array arr = (Array)value; 
    arr.SetValue(myValue, myIndex); 
} 
else 
{ 
    ... 
} 
+1

"संपत्ति मूल्य बदलना" वाक्यांश को भ्रमित कर रहा है, क्योंकि यह "संपत्ति को स्थापित करना" (प्रत्यक्ष या परोक्ष रूप से) का पर्याय बन गया है। असल में, संपत्ति मूल्य यहां ** कभी नहीं बदलता ** (यह वही संदर्भ है); यह सरणी सामग्री है जो बदलती है। साथ ही, 'GetValue' को यहां दूसरे पैरामीटर की आवश्यकता है। –

+0

GetValue अब तय किया गया है – bluish

0

यहां पर टी कोड इस पर काम करेगा, इसकी स्थिति 10 स्थिति सरणी भरने के लिए, आप इसे किसी भी आकार सरणी के लिए कर सकते हैं।

फ़ंक्शन PopulateInstance मुझे आवश्यकतानुसार डेटा संरचना तैयार करता है।

object singleval; 
    Array arrayval; 
    System.Type LocalPType = obj.GetType().GetField(node.Name).FieldType; 
    if (LocalPType.IsArray) 
    { 
     singleval = TreeNodeProperty.CreateNewInstance(LocalPType.GetElementType()); 
     arrayval = Array.CreateInstance(LocalPType, 10); 
     for(int i = 0; i < 10; i++) 
     { 
      singleval = PopulateInstance(singleval, node); 
      arrayval.SetValue(singleval, i); 
     } 
     obj.GetType().GetField(node.Name).SetValue(obj, arrayval); 
    } 
    else 
    { 
     object val; 
     val = Activator.CreateInstance(LocalPType); 
     obj.GetType().GetField(node.Name).SetValue(obj,   PopulateInstance(val, node)); 
    }