Мой технический директор (Главный технический директор) попросил меня придумать способ, чтобы он мог написать одну единственную функцию в базовом классе и получить доступ ко всем свойствам класс ребенка. Вот что я придумал -Доступ к свойствам дочернего класса через функцию в родительском классе
Базовый класс
class Assets
{
public Assets getPropertyVal(Assets asObj)
{
PropertyInfo[] propInfos = asObj.GetType().GetProperties();
string strAttributeValue = "10";
foreach (PropertyInfo propInfo in propInfos)
{
// Getting the value
var propValue = propInfo.GetValue(asObj, null);
// Setting the value
propInfo.SetValue(asObj, Convert.ChangeType(strAttributeValue, propInfo.PropertyType), null);
}
return asObj;
}
}
Детский класс
class House : Assets
{
public int rooms{get; set;}
}
Program.cs файл
class Program
{
static void Main(string[] args)
{
House hsObj = new House();
hsObj.rooms = 5;
Assets asObj = hsObj.getPropertyVal(hsObj);
// Returns asObj as JSON
}
}
Теперь это прекрасно работает, но мне просто интересно, есть ли лучший способ сделать это на C#.
Отметьте, что Мы не знаем Какие свойства будут присутствовать в дочернем классе, поэтому это нужно будет определить во время выполнения.
UPDATE: разъясняя, мне было просто интересно, если есть лучший способ получить доступ к свойствам класса ребенка, один без использования отражения. Важно отметить, что мы понятия не имеем, какие свойства имеет дочерний класс.
ОБНОВЛЕНИЕ # 2: Я работаю с продуктом, который имеет множество объектов. Эти объекты имеют разные свойства. Я хочу иметь доступ и работать со всеми этими свойствами в одном месте. Эта функция в точности такова. Это одно место, откуда я могу получить доступ ко всем данным.
В вашем примере вы создаете объект и получаете все свойства объекта, а затем устанавливаете те же свойства в объекте. Это выглядит так: 'var propValue = asObj.rooms; asObj.rooms = (int) propValue; '. Что именно вы хотите? Вы хотите скопировать все свойства из дочернего класса в базовый класс? –
@VyacheslavVolkov, мне просто интересно, есть ли лучший способ доступа к свойствам дочернего класса без использования рефлексии. –
Я не понимаю цели этого. В вашем примере вы жестко кодируете имя дочернего объекта с помощью 'Console.WriteLine (hsObj.rooms);'. Вы можете просто избавиться от hsObj = (House) hsObj.getPropertyVal (hsObj); 'вообще. Отражение полностью потеряно. Можете ли вы придумать лучший пример того, что вы пытаетесь выполнить? – Dan