我有称为reel1,reel2,reel3和reel4的属性。如何通过将整数(1-4)传递给我的方法来动态引用这些属性?
具体来说,我正在寻找如何在不知道对象名称的情况下获取对象引用。
在Javascript中,我会这样做:
temp = eval("reel" + tempInt);
和temp将等于对象reel1。
似乎无法在C#中找出这个简单的概念。
答案 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());
}
}
}
}