Получение объекта путем отражения

#c# #.net #reflection #c#-4.0 #system.reflection

#c# #.net #отражение #c #-4.0 #system.reflection

Вопрос:

Я ищу механизм, который в c # работает подобным образом:

 Car car1;
Car car2;

Car car = (Car)SomeMechanism.Get("car1");
  

car1 и car2 являются полями

Итак, я хочу получить некоторый объект с отражением, а не с типом :/ Как я могу это сделать на c #?

Комментарии:

1. Не уверен, о чем вы спрашиваете…

2. Я думаю, вам нужно немного больше контекста — являются ли car1 и car2 полями или локальными? Если они являются локальными, то @Jason прав — вы не можете этого сделать. Что еще более важно, почему вы хотите сделать это с locals?

Ответ №1:

Это невозможно для локальных переменных, но если у вас есть поле, вы можете сделать

 class Foo{

    public Car car1;
    public Car car2;
}
  

вы можете сделать

 object fooInstance = ...;

Car car1 = (Car)fooInstance.GetType().GetField("car1").GetValue(fooInstance);
  

Комментарии:

1. Есть ли способ сделать это поле общедоступным?

2. @piotrek да. Car car1 = (Car)fooInstance.GetType().GetField("car1").GetValue(fooInstance, BindingFlags.NonPublic | BindingFlags.Instance); для получения закрытых полей.

3. @BalaR Здесь опечатка. Ты имел в виду Car car1 = (Car)fooInstance.GetType().GetField("car1",BindingFlags.NonPublic | BindingFlags.Instance).GetValue(fooInst‌​ance);

4. Как насчет сейчас, в 2017 году?

5. зачем вам это делать, когда у вас уже есть fooInstance ?

Ответ №2:

Похоже, вы пытаетесь получить доступ к локальным переменным путем отражения. Это невозможно. Локальные переменные недоступны путем отражения.

Ответ №3:

Правильно ли я предполагаю, что у вас есть две переменные и что вы хотите получить одну или другую динамически? Я не верю, что вы можете сделать это с помощью отражения (по крайней мере, нелегко), но вы можете сделать это с помощью функций довольно легко.

 // Declaration
class SomeMechanism
{
    public static T Get<T>(Func<T> getter);
}

// Usage
Car car1;
Car car2;

Car car = SomeMechanism.Get(() => car1);