Словарь <string, object> для сопоставления объектов - PullRequest
0 голосов
/ 30 января 2011

Существует ли какой-либо объект-объект, который может отображать свойства из словаря (или другой коллекции имен-значений)?

Допустим, у меня есть классы

public class SomeClass
{
    public string Text { get; set; }
    public Address HomeAddress { get; set; }
    public List<int> Numbers { get; set; }
}
public class Address
{
    public string Street { get; set; }
    public string PostalCode { get; set; }
    public string City { get; set; }    
}

Что бы я хотел сделать, это

var values = new Dictionary<string,object>();
values.Add("Text","Foo");
values.Add("HomeAddress.Street","Some street 123");
values.Add("HomeAddress.PostalCode","12345");
values.Add("HomeAddress.City","Some city");
values.Add("Numbers[0]",123);
values.Add("Numbers[1]",234);
values.Add("Numbers[2]",345);

SomeClass some = aMapperTool.CreateFromDictionary<SomeClass>(values);

Это в основном похоже на DefaultModelBinder в ASP.NET MVC, который требует много материала, связанного с контекстом и метаданными, и поэтому не совсем удобен.

Ответы [ 2 ]

1 голос
/ 23 марта 2013

Вы можете использовать функциональность ComponentModel (об этом уже говорилось в stackoverflow

, как установить обнуляемый тип с помощью кода отражения (c #)?

using System.ComponentModel;   

public void FillMeUp(Dictionary<string, string> inputValues){

        PropertyInfo[] classProperties  = this.GetType().GetProperties();

       var properties = TypeDescriptor.GetProperties(this);

       foreach (PropertyDescriptor property in properties)
       {
           if (inputValues.ContainsKey(property.Name))
           {
               var value = inputValues[property.Name];
               property.SetValue(this, 
                                 property.Converter.ConvertFromInvariantString(value));
           }
       }
0 голосов
/ 30 января 2011

Для этого вы не обойдете деревья отражения или выражения.

С отражением это будет примерно следующим образом:

  1. создайте объект T
  2. итерируйте по ключам в details, при необходимости создайте из него фактическое имя свойства (HomeAddress.Street -> HomeAdress или Numbers[0] -> Number).В зависимости от типа свойства (если вы найдете ., вам сначала нужно создать дочерний объект, если вы найдете [, вам нужно инициализировать IEnumerable).
  3. послеконструируя любые дочерние структуры, создайте родительский объект.

Хотя это возможное решение, в моей голове один вопрос: «Почему?»

...