如何在C#中动态引用递增的属性?

时间:2010-04-12 15:37:42

标签: c# javascript reflection

我有称为reel1,reel2,reel3和reel4的属性。如何通过将整数(1-4)传递给我的方法来动态引用这些属性?

具体来说,我正在寻找如何在不知道对象名称的情况下获取对象引用。

在Javascript中,我会这样做:

temp = eval("reel" + tempInt);

和temp将等于对象reel1。

似乎无法在C#中找出这个简单的概念。

5 个答案:

答案 0 :(得分:6)

这是C#中通常避免的。通常还有其他更好的选择。

话虽如此,您可以使用Reflection来获取这样的属性的值:

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

然而,更好的选择可能是在您的课程中使用Indexed Property,这样您就可以this[tempInt]

答案 1 :(得分:0)

您可以使用PropertyInfo通过包含属性名称的字符串访问属性值。

示例:

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

答案 2 :(得分:0)

试试this link 获取属性的相应PropertyInfo对象,然后使用GetValue将其传递给您要评估属性的实例

答案 3 :(得分:0)

这是你可以用javascript这样的解释性语言来解决的问题之一,在C#这样的编译语言中非常困难。最好采取另一种策略:

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

答案 4 :(得分: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());
            }
        }
    }
}