Moje CTO (Chief Technical Officer) poprosił mnie o wymyślenie sposobu, w którym mógłby napisać jedną funkcję w klasie bazowej i mieć dostęp do wszystkich właściwości klasa dziecka. Oto co wymyśliłem -Dostęp do właściwości klasy potomnej poprzez funkcję w klasie nadrzędnej
klasy bazowej
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;
}
}
klasa Child
class House : Assets
{
public int rooms{get; set;}
}
Program.cs złożyć
class Program
{
static void Main(string[] args)
{
House hsObj = new House();
hsObj.rooms = 5;
Assets asObj = hsObj.getPropertyVal(hsObj);
// Returns asObj as JSON
}
}
Teraz działa dobrze, ale właśnie zastanawiałem się, czy istnieje lepszy sposób to zrobić w C#.
Należy pamiętać, że nie znamy jakie właściwości będą obecne w klasie dziecka, więc to będzie musiało zostać określone w czasie wykonywania.
UPDATE: co jasne, właśnie zastanawiałem się, czy istnieje lepszy sposób, aby uzyskać dostęp do właściwości klasy, jedno dziecko bez użycia refleksji. Ważne jest, aby pamiętać, że nie mamy pojęcia, jakie właściwości może mieć klasa dziecka.
AKTUALIZACJA # 2: Pracuję z produktem, który ma wiele podmiotów. Te jednostki mają różne właściwości. Chcę mieć dostęp do wszystkich tych właściwości i pracować z nimi w jednym miejscu. Ta funkcja jest właśnie taka. To jedno miejsce, z którego mogę uzyskać dostęp do wszystkich danych.
W swoim przykładzie utworzysz obiekt i uzyskasz wszystkie właściwości obiektu, a następnie ustawisz te same właściwości w obiekcie. Wygląda to tak: 'var propValue = asObj.rooms; asObj.rooms = (int) propValue; '. Czego dokładnie chcesz? Czy chcesz skopiować wszystkie właściwości z klasy potomnej do klasy bazowej? –
@VyacheslavVolkov, Właśnie zastanawiałem się, czy istnieje lepszy sposób uzyskania dostępu do właściwości klasy potomnej bez użycia odbicia. –
Nie rozumiem celu tego. W twoim przykładzie trudno jest zakodować nazwę właściwości podrzędnej za pomocą 'Console.WriteLine (hsObj.rooms);'. Równie dobrze możesz po prostu pozbyć się linii 'hsObj = (House) hsObj.getPropertyVal (hsObj);'. Odbicie jest całkowicie zmarnowane. Czy możesz wymyślić lepszy przykład tego, co próbujesz osiągnąć? – Dan