#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(fooInstance);
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);