C# Использование отражения для получения экземпляра класса, заданного строковой переменной, содержащей его имя
В C# у меня есть несколько экземпляров класса "CItems"(см. Ниже). Я получаю строку во время выполнения экземпляра, который хочу использовать (в этом случае для вызова открытого метода - addPropertyToList"). Я знаю, что должен использовать рефлексию, но я не могу понять это правильно.
CItems me = new CItems();
CItems conversations = new CItems();
string whichCItem = "me"
properties = <whichCItem>.addPropertyToList(properties, "FirstName", "Ken");
Я пробовал много вещей, таких как:
var myobject = this;
string propertyname = "me";
PropertyInfo property = myobject.GetType().GetProperty(propertyname);
object value = property.GetValue(myobject, null);
Но это привело к тому, что: Ссылка на объект не установлена на экземпляр объекта. Потому что свойство заканчивается нулевым.
Спасибо за любую помощь и, пожалуйста, будьте нежны. Я действительно понятия не имею, что я делаю, и я, возможно, использовал неправильную терминологию.
2 ответа
Просто Dictionary<T, U>
может работать на тебя. Рассмотрим пример:
CItems me = new CItems();
CItems conversations = new CItems();
...
var dic = new Dictionary<string, CITems>();
doc.Add("me", me);
doc.Add("conversations", conversations);
...
//find object
CITems result= null;
dic.TryGetValue(searchString, out result);
PropertyInfo property = myobject.GetType().GetProperty(propertyname);
Это правильный подход для извлечения свойства, идентифицируемого именем свойства. Вы уже знаете тип, на который он объявлен, поэтому вы просто используете
var propertyInfo = CItems.GetProperty(propertyname)
чтобы получить свойство класса. Теперь вам нужно установить это свойство в указанном экземпляре, чтобы вы могли вызывать
propertyInfo.SetValue(<instance>, value);
Как идентифицируются ваши экземпляры? Конечно, вы не возвращаете имя переменной, в которой хранится указатель объекта?
Является ли что-то вроде следующего достижимым?
IEnumerable<CItems> myItems = new { new CItem("me"), new CItem("conversations") }
void somemethod(string instanceName, string propertyname)
{
var instance = myItems.FirstOrDefault(item => item.Name == instanceName);
if(instance == null) return;
var propertyInfo = CItems.GetProperty(propertyname);
propertyInfo.SetValue(instance, value);
}