Как я динамично ссылаюсь на увеличенные свойства в C#?

У меня есть свойства, названные reel1, reel2, reel3, и reel4. Как я могу динамично сослаться на эти свойства, просто передав целое число (1-4) к моему методу?

А именно, я ищу, как получить ссылку на объект, не зная название объекта.

В JavaScript я сделал бы:

temp = eval("reel" + tempInt);

и временный файл был бы равен reel1, объекту.

Может казаться, не понимает это простое понятие в C#.

6
задан tshepang 14 May 2014 в 20:56
поделиться

5 ответов

Попробуйте эту ссылку Получите соответствующий объект PropertyInfo для свойства, а затем используйте для него GetValue, передав ему экземпляр, для которого вы хотите оценить свойство

{{1} }
0
ответ дан 17 December 2019 в 02:26
поделиться

Вы можете получить доступ к значению свойства строкой, содержащей имя свойства, используя PropertyInfo .

Пример:

PropertyInfo pinfo = this.GetType().GetProperty("reel" + i.ToString());
return (int)pinfo.GetValue(this, null);
0
ответ дан 17 December 2019 в 02:26
поделиться

Используйте 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());
            }
        }
    }
}
0
ответ дан 17 December 2019 в 02:26
поделиться

Это одна из тех вещей, которые могут сойти с рук в интерпретируемом языке, таком как javascript, что очень сложно в компилируемом языке, таком как C #. Лучше всего пойти другим путем:

switch(tempInt)
{
    case 1:
       temp = reel1;
       break;
    case 2:
       temp = reel2;
       break;
    case 3:
       temp = reel3;
       break;
}
0
ответ дан 17 December 2019 в 02:26
поделиться

Этого обычно избегают в C #. Часто есть другие, лучшие альтернативы.

При этом вы можете использовать Reflection для получения значения свойства следующим образом:

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

Однако лучшей альтернативой может быть использование Indexed Property в вашем классе, что позволит вы должны сделать этот [tempInt] .

6
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: