2013-06-21 4 views
0

У меня есть экземпляр объекта. В конструкторе объекта я хотел бы разрешить пользователю передавать в словарь, с помощью которого можно инициализировать, а некоторые, если не все свойства объекта. Теперь вместо того, чтобы использовать условное выражение, я бы хотел использовать рефлексию, отразить свойства, содержащиеся в экземпляре объекта, и если имя свойства сопоставляется с ключом в словаре, обновите значение свойства с соответствующим значением в словаре.Reflection Инициализировать свойства Значения объекта Instance Использование

При работе над этим, у меня есть следующий код, но он не обновляет значение экземпляра моего объекта. Понравилась бы какая-нибудь помощь, чтобы это работало, пожалуйста?

public void Initialize() 
     { 
      if (Report.GlobalParameters != null) 
      { 
       PropertyInfo[] propertyInfos = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 
       foreach (PropertyInfo propertyInfo in propertyInfos) 
       { 
        if (Report.GlobalParameters.ContainsKey(propertyInfo.Name)) 
        { 
         Type type = this.GetType(); 
         PropertyInfo property = type.GetProperty(propertyInfo.Name); 
         property.SetValue(this, Report.GlobalParameters[propertyInfo.Name], null); 
        } 
       } 

      } 
     } 
+0

Образец объекта был бы хорош (только на свойство, которое показывает «не обновляет значение экземпляра моего объекта»). Также может быть хорошей идеей упростить выборку в столбце, чтобы использовать жестко заданное имя и значение. –

+1

Я пробовал свой код на объекте Person, который я создал, и он работает хорошо, никаких проблем вообще! !! –

+0

Спасибо, я проверил и, похоже, сейчас работает нормально. Не знаю, что я изменил. Благодарю. – Kobojunkie

ответ

2

Во-первых, у вас прилагается отладчик инспектировать или нет, вы получаете внутри самой вложенной if? И если вы не попадаете в самый вложенный if, можете ли вы понять, почему, сравнивая, что вы ожидаете от того, что происходит на самом деле, когда вы проверяете в отладчике?

Во-вторых, внутри самой вложенными if, вы можете удалить первые две строки, и заменить property с propertyInfo в третьей строке (которая будет единственной линией остающуюся после удаления первых двух). У вас уже есть PropertyInfo с данным именем в руке, почему вы снова смотрите его?

Помимо этого, это выглядит как то, что у вас есть, должно работать. Таким образом, ошибка лежит где-то в другом месте, что означает, что вы не проходите в правильных значениях, или что-то еще, о чем вы нам не говорите, происходит.

Вот small working example того, что у вас есть, что должно помочь вам:

using System; 
using System.Collections.Generic; 

class Foo { 
    public int Bar { get; set; } 
    public Foo(Dictionary<string, object> values) { 
     var propertyInfo = this.GetType().GetProperties(); 
     foreach(var property in propertyInfo) { 
      if(values.ContainsKey(property.Name)) { 
       property.SetValue(this, values[property.Name], null); 
      } 
     } 
    } 
} 

class Program { 
    public static void Main(String[] args) { 
     Dictionary<string, object> values = new Dictionary<string, object>(); 
     values.Add("Bar", 42); 
     Foo foo = new Foo(values); 
     Console.WriteLine(foo.Bar); // expect 42 
    } 
} 

Обратите внимание, что это именно ваша логика и works. Помогает ли это?

-1

Работает ли оно лучше, если вы его включите и сделаете?

public void Initialize() 
    { 
     if (Report.GlobalParameters != null) 
     { 
      foreach (KeyValuePair<string, object> kvp in Report.GlobalParameters) 
      { 
       PropertyInfo pi = this.GetType().GetProperty(kvp.Key, BindingFlags.Public | BindingFlags.Instance); 
       if (pi != null) 
       { 
        try 
        { 
         pi.SetValue(this, kvp.Value, null); 
        } 
        catch (Exception ex) 
        { 
         MessageBox.Show(kvp.Key + Environment.NewLine + ex.ToString(), "Error Setting Property Value"); 
        } 
       } 
       else 
       { 
        MessageBox.Show(kvp.Key, "Property Not Found"); 
       } 
      } 
     } 
    } 
+0

Downvote, потому что ... –

Смежные вопросы