2010-04-12 49 views
6

我有屬性叫做reel1,reel2,reel3和reel4。我如何通過傳遞一個整數(1-4)到我的方法來動態引用這些屬性?如何動態引用C#中增加的屬性?

具體而言,我正在尋找如何在不知道對象名稱的情況下獲取對象引用。

在Javascript中,我會做:

temp = eval("reel" + tempInt); 

和臨時將等於reel1的對象。

似乎無法在C#中找出這個簡單的概念。

+1

在Javascript中,這就是你如何做到這一點,但除非有很好的理由,遠離'eval'。 – 2010-04-12 15:43:03

+0

是的,不需要eval - 只需使用括號表示法,如'myObj ['reel'+ tempInt]'。請注意,如果這些屬性是全局屬性,那麼您的對象將是'window' - 所以'window ['reel'+ tempInt]' – jbyrd 2017-07-03 13:15:25

回答

0

您可以使用PropertyInfo通過包含屬性名稱的字符串來訪問屬性值。

例子:

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

這東西是典型的C#避免。通常還有其他更好的選擇。

話雖這麼說,你可以使用反射來獲得一個屬性的值是這樣的:

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

一個更好的選擇,然而,可能是你的類使用Indexed Property,這將讓你做this[tempInt]

+2

只需重申,不要這樣做。使用索引器 – 2010-04-12 15:47:45

0

嘗試this link 獲取屬性對應的PropertyInfo對象,然後就可以通過它的實例中使用的GetValue上要評估物業

0

這是的事情之一,你可以在解釋與逃脫像JavaScript這樣的語言,這在像C#這樣的編譯語言中非常困難。最好採取另一個大頭釘:

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

使用InvokeMember和BindingFlags.GetProperty。您必須擁有對「擁有」對象的引用,並且您必須知道您嘗試檢索的屬性的類型。

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()); 
      } 
     } 
    } 
}