#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();
}
}