2010-04-12 5 views
6

मेरे पास reel1, reel2, reel3, और reel4 नामक गुण हैं। मैं अपनी विधि में केवल एक पूर्णांक (1-4) पास करके इन गुणों को गतिशील रूप से संदर्भित कैसे कर सकता हूं?मैं सी # में वृद्धिशील गुणों को गतिशील रूप से संदर्भित कैसे करूं?

विशेष रूप से, मैं वस्तु के नाम को जानने के बिना ऑब्जेक्ट संदर्भ कैसे प्राप्त करना चाहता हूं।

जावास्क्रिप्ट में, मैं करना होगा:

temp = eval("reel" + tempInt); 

और अस्थायी reel1, वस्तु के बराबर होगा।

सी # में इस सरल अवधारणा को समझने के लिए प्रतीत नहीं होता है।

+1

जावास्क्रिप्ट में, इस तरह आप इसे * कर सकते हैं, लेकिन जब तक कि वास्तव में कोई अच्छा कारण न हो, तब तक दूर रहें, 'eval' से बहुत दूर रहें। –

+0

हाँ eval के लिए कोई ज़रूरत नहीं है - बस ब्रैकेट नोटेशन का उपयोग करें, जैसे 'myObj [' reel '+ tempInt] '। नोट करें कि यदि वे वैश्विक गुण हैं, तो आपकी वस्तु 'विंडो' होगी - इसलिए 'विंडो [' रील '+ tempInt] ' – jbyrd

उत्तर

0

आप PropertyInfo का उपयोग कर संपत्ति नाम वाले स्ट्रिंग द्वारा संपत्ति मान तक पहुंच सकते हैं।

उदाहरण:

PropertyInfo pinfo = this.GetType().GetProperty("reel" + i.ToString()); 
return (int)pinfo.GetValue(this, null); 
6

यह कुछ ऐसा है आम तौर पर सी # में से बचा रहा है। अक्सर अन्य, बेहतर विकल्प होते हैं।

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

object temp = this.GetType().GetProperty("reel" + tempInt.ToString()).GetValue(this, null); 

एक बेहतर विकल्प है, तथापि, अपने वर्ग पर एक Indexed Property उपयोग करने के लिए है, जो करने के लिए आप की अनुमति होगी हो सकता है this[tempInt] करें।

+2

बस दोहराने के लिए, ऐसा न करें। एक सूचकांक का प्रयोग करें –

0

प्रयास करें this link संपत्ति के लिए इसी PropertyInfo वस्तु प्राप्त करें और फिर इसे यह उदाहरण गुजर पर getValue का उपयोग जिस पर आप संपत्ति

0

ये कुछ ऐसी एक आप एक व्याख्या में के साथ भाग प्राप्त कर सकते हैं का मूल्यांकन करना चाहते जावास्क्रिप्ट जैसी भाषा, सी # जैसी संकलित भाषा में बहुत मुश्किल है। एक और tack लेने के लिए सर्वश्रेष्ठ:

switch(tempInt) 
{ 
    case 1: 
     temp = reel1; 
     break; 
    case 2: 
     temp = reel2; 
     break; 
    case 3: 
     temp = reel3; 
     break; 
} 
0

बाइंडिंगफ्लैग्स.गेटप्रोपर्टी के साथ InvokeMember का उपयोग करें। आपके पास "स्वामित्व" ऑब्जेक्ट का संदर्भ होना चाहिए, और आपको उस प्रॉपर्टी के प्रकार को जानना चाहिए जिसे आप पुनर्प्राप्त करने का प्रयास कर रहे हैं।

namespace Cheeso.Toys 
{ 
    public class Object1 
    { 
     public int Value1 { get; set; } 
     public int Value2 { get; set; } 
     public Object2 Value3 { get; set; } 
    } 

    public class Object2 
    { 
     public int Value1 { get; set; } 
     public int Value2 { get; set; } 
     public int Value3 { get; set; } 
     public override String ToString() 
     { 
      return String.Format("Object2[{0},{1},{2}]", Value1, Value2, Value3); 
     } 
    } 

    public class ReflectionInvokePropertyOnType 
    { 

     public static void Main(string[] args) 
     { 
      try 
      { 
       Object1 target = new Object1 
        { 
         Value1 = 10, Value2 = 20, Value3 = new Object2 
          { 
           Value1 = 100, Value2 = 200, Value3 = 300 
          } 
        }; 

       System.Type t= target.GetType(); 

       String propertyName = "Value3"; 

       Object2 child = (Object2) t.InvokeMember (propertyName, 
                  System.Reflection.BindingFlags.Public | 
                  System.Reflection.BindingFlags.Instance | 
                  System.Reflection.BindingFlags.GetProperty, 
                  null, target, new object [] {}); 
       Console.WriteLine("child: {0}", child); 
      } 
      catch (System.Exception exc1) 
      { 
       Console.WriteLine("Exception: {0}", exc1.ToString()); 
      } 
     } 
    } 
} 
संबंधित मुद्दे