Kurz gesagt, ich habe eine C# -Funktion, die eine Aufgabe für einen bestimmten Typ ausführt, der als Objektinstanz übergeben wird. Alles funktioniert gut, wenn eine Klasseninstanz übergeben wird. Wenn das Objekt jedoch als Schnittstelle deklariert wird, möchte ich wirklich die konkrete Klasse finden und die Aktion für diesen Klassentyp ausführen.Suchen des konkreten Typs hinter einer Schnittstelleninstanz
Hier ist das allgegenwärtige schlechte Beispiel (glänzend mit falscher Eigenschaft Gehäuse usw.):
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
}
ich der Code in Perform möchte Reflexion verwenden dagegen Parameter sind und sieht, dass es nicht nur eine Instanz von IA ist aber das ist eine Instanz von B und die Eigenschaft "b" über GetProperties() zu sehen. Wenn ich .GetType() verwende, bekomme ich den Typ von IA - nicht was ich will.
Wie kann PerformAction den zugrunde liegenden Beton-Typ der Instanz von IA bestimmen?
Einige könnten versucht sein, die Verwendung einer abstrakten Klasse vorzuschlagen, aber das ist nur die Einschränkung meines schlechten Beispiels. Die Variable wird ursprünglich als Schnittstelleninstanz deklariert.
Das klingt wie ein schlechtes Design. Sie sollten Polymorphismus verwenden, anstatt Ihre Methode über bestimmte konkrete Typen wissen zu lassen. Was passiert, wenn Sie später einen hinzufügen? –
Schadet das nicht dem Zweck einer Schnittstelle? Sie sollten sich nicht darum kümmern, was der konkrete Typ ist, solange er die Schnittstelle implementiert. –
+1 zu John und Chris, ist es nicht nur schlechtes Design, aber die Frage ergibt keinen Sinn. –