У меня есть свойства, названные reel1, reel2, reel3, и reel4. Как я могу динамично сослаться на эти свойства, просто передав целое число (1-4) к моему методу?
А именно, я ищу, как получить ссылку на объект, не зная название объекта.
В JavaScript я сделал бы:
temp = eval("reel" + tempInt);
и временный файл был бы равен reel1, объекту.
Может казаться, не понимает это простое понятие в C#.
Попробуйте эту ссылку Получите соответствующий объект PropertyInfo для свойства, а затем используйте для него GetValue, передав ему экземпляр, для которого вы хотите оценить свойство
{{1} } Вы можете получить доступ к значению свойства строкой, содержащей имя свойства, используя PropertyInfo
.
Пример:
PropertyInfo pinfo = this.GetType().GetProperty("reel" + i.ToString());
return (int)pinfo.GetValue(this, null);
Используйте 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());
}
}
}
}
Это одна из тех вещей, которые могут сойти с рук в интерпретируемом языке, таком как javascript, что очень сложно в компилируемом языке, таком как C #. Лучше всего пойти другим путем:
switch(tempInt)
{
case 1:
temp = reel1;
break;
case 2:
temp = reel2;
break;
case 3:
temp = reel3;
break;
}
Этого обычно избегают в C #. Часто есть другие, лучшие альтернативы.
При этом вы можете использовать Reflection для получения значения свойства следующим образом:
object temp = this.GetType().GetProperty("reel" + tempInt.ToString()).GetValue(this, null);
Однако лучшей альтернативой может быть использование Indexed Property в вашем классе, что позволит вы должны сделать этот [tempInt]
.