Сохранение / восстановление значений из класса в / из списка имен и значений свойств

#c# #linq #collections

#c# #linq #Коллекции

Вопрос:

Я не уверен, какой лучший и самый простой способ сделать это, поэтому приветствуются любые советы.

Я хочу получить все поля в любом / all / одном классе объектов домена и динамически добавлять префикс / удалять префикс при вызове определенного метода.

Например, у меня есть такие объекты, как:

 public class Shop
{
 public string TypeOfShop{get;set}
 public string OwnerName {get;set}
 public string Address {get;set}
}

public class Garage
{
 public string Company {get;set}
 public string Name {get;set}
 public string Address {get;set}
}
  

и так далее…

Я хочу получить список свойств с префиксом:

 public Class Simple
{
    public class Prop
    {
     public string Name{get;set;}
     public string Value{get;set;}
    } 

    public ICollection list = new List<Prop>();

    //set all prop
    public void GetPropertiesWithPrefix(Garage mygarage, string prefix)
    {
     list.Add(new Prop{Name = prefix   "_Company", Value = mygarage.Company});
     //so on... upto 50 props...
    }

}

//to get this list I can simple call the list property on the Simple class
  

При чтении каждого поля я использую инструкцию switch и устанавливаю значение.

 //Note I return a collection of Prop that have new values set within the view,lets say
//this is a result returned from a controller with the existing prop names and new values...

public MyGarage SetValuesForGarage(MyGarage mygarage, string prefix, ICollection<Prop> _props)
{

  foreach (var item in _prop)
  {
   switch(item.Name)
   {
     case prefix   "Company":
     mygarage.Company = item.Value;
     break;
     //so on for each property...

   }

  }

}
  

Есть ли лучший, более простой или элегантный способ сделать это с помощью linq или иным способом?

Ответ №1:

Вы могли бы хранить реквизиты в словаре, а затем иметь:

 mygarage.Company = _props[prefix   "_Company"];
mygarage.Address = _props[prefix   "_Address"];
//And so on...
  

в вашем SetValuesForGarage методе вместо цикла с switch внутри.

Редактировать

Для получения дополнительной информации об использовании Dictionary см. MSDN.

Вы можете определить list что-то вроде:

 Dictionary<string, string> list = new Dictionary<string, string>();
  

И в вашем GetPropertiesWithPrefix методе должно быть что-то вроде следующего:

 list.Add(prefix   "_Company", mygarage.Company);
list.Add(prefix   "_Address", mygarage.Address);
//And so on...
  

Это приведет к ликвидации вашего Prop класса.

Комментарии:

1. Этот класс Prop передается этому методу с сервисного уровня, следовательно, почему я его использую, я мог бы . ToDictionary() этот список, но я имею в виду проверку данных сохранение, приведенный выше пример заботится о настройке значения, но после этого примера я забываю, что мне нужна проверка, дело в том, что даже если я использую словарь, это почти те же строки кода, что и цикл foreach и оператор switch … Короче говоря, не похоже, что есть слишком лучший способ сделать это?

Ответ №2:

Возможно, вам подойдет следующий метод. Он принимает любой объект, просматривает его свойства и возвращает список с вашими Prop-объектами, каждый для каждого свойства.

 public class PropertyReader
{
    public static List<Prop> GetPropertiesWithPrefix(object obj, string prefix)
    {
        if (obj == null)
        {
            return new List<Prop>();
        }

        var allProps = from propInfo
                       in obj.GetType().GetProperties()
                       select new Prop()
                       {
                           Name = prefix   propInfo.Name,
                           Value = propInfo.GetValue(obj, null) as string
                       };
        return allProps.ToList();
    }
}