Aby skrócić długą historię, mam funkcję C#, która wykonuje zadanie na danym typie, który jest przekazywany jako instancja obiektu. Wszystko działa poprawnie, gdy instancja klasy jest przekazywana. Jednak, gdy obiekt jest zadeklarowany jako interfejs, chciałbym znaleźć konkretną klasę i wykonać działanie na tym typie klasy.Znajdowanie typu betonu za instancją interfejsu
Oto wszechobecne zły przykład (olśniewający z niepoprawny nieruchomości obudowy itp):
public interface IA
{
int a { get; set; }
}
public class B : IA
{
public int a { get; set; }
public int b { get; set; }
}
public class C : IA
{
public int a { get; set; }
public int c { get; set; }
}
// snip
IA myBObject = new B();
PerformAction(myBObject);
IA myCObject = new C();
PerformAction(myCObject);
// snip
void PerformAction(object myObject)
{
Type objectType = myObject.GetType(); // Here is where I get typeof(IA)
if (objectType.IsInterface)
{
// I want to determine the actual Concrete Type, i.e. either B or C
// objectType = DetermineConcreteType(objectType);
}
// snip - other actions on objectType
}
Chciałbym kod w PerformAction używać refleksji na to parametr i widzę, że to nie tylko wystąpienie AF ale to jest instancja klasy B i zobaczenie właściwości "b" za pomocą metody GetProperties(). Jeśli używam metody .GetType(), otrzymuję typ IA - nie to, czego chcę.
W jaki sposób PerformAction może określić bazowy typ betonu instancji IA?
Niektórzy mogą chcieć zasugerować użycie klasy abstrakcyjnej, ale to tylko ograniczenie mojego złego przykładu. Zmienna zostanie pierwotnie zadeklarowana jako instancja interfejsu.
To brzmi jak zły projekt. Powinieneś używać polimorfizmu, zamiast znać swoją metodę o konkretnych rodzajach betonu. Co stanie się, jeśli dodasz później? –
Czy to nie jest celem interfejsu? Nie powinieneś przejmować się tym, jaki konkretny typ ma tak długo, jak implementuje interfejs. –
+1 do Johna i Chrisa, nie tylko jest to zły projekt, ale pytanie nie ma sensu. –