C # Использование отражения для получения экземпляра класса, заданного строковой переменной, содержащей его имя - PullRequest
0 голосов
/ 21 сентября 2018

В 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 ]

0 голосов
/ 21 сентября 2018
PropertyInfo property = myobject.GetType().GetProperty(propertyname);

Это правильный подход для извлечения свойства, идентифицируемого именем свойства.Вы уже знаете тип, для которого он объявлен, поэтому вы просто используете

var propertyInfo = CItems.GetProperty(propertyname)

, чтобы получить свойство class .Теперь вам нужно установить это свойство для идентифицированного экземпляра, чтобы вы могли вызывать

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);
}
0 голосов
/ 21 сентября 2018

Простой 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);
...