2010-04-12 26 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()); 
      } 
     } 
    } 
}