2017-03-01 2 views
1

Angesichts die folgenden 2 ErweiterungsmethodenC# Dispatching Erweiterungsmethoden auf Basis Value nicht Referenz

public static string getIDPropertyName(this object value) 
{ 
    return "ID"; 
} 

public static string getIDPropertyName<IDType>(this EntityRestIdentityDescriber<IDType> entityIdentityDescriber) 
{ 
    return entityIdentityDescriber.propertyNameDescribingID(); 
} 

und die folgenden 2 Anrufungen

//arrange 

object test = new CustomEntityRestModelIdentity(); 
//test.UserName = "KKK"; 
//act 
var actual = test.getIDPropertyName(); //calls the first extension method 
var actual2 = (test as CustomEntityRestModelIdentity).getIDPropertyName(); //calls the second extension method 

Wie kann ich die zweite Erweiterungsmethode, obwohl sein Referenztyp ausführen ist Objekt, aber sein Werttyp ist ein EntityRestIdentityDescriber? Ich suche statischen Polymorphismus.

+0

Haben Sie meine, wie kann man es ohne Casting? –

+1

Erweiterungsmethoden werden zur Kompilierungszeit ausgewählt. Sie haben bereits eine Problemumgehung in der Frage (actual2). – buffjape

+0

@AliSheikhNezami das ist kein Test lol. Was ich versuche, ist, über Reflektion mit einem Objekt zu landen und dann getIDPropertyName aufzurufen, um die richtige Methode zur Ausführung zu erhalten, falls das Objekt EntityRestIdentityDescriber implementiert. Wenn das Objekt es nicht implementiert, wird standardmäßig die andere Methode verwendet, die die ID zurückgibt. Gibt es keine Möglichkeit, die andere Methode ohne Casting oder Vererbung aufzurufen? –

Antwort

1

versuchen, diese

public static string getIDPropertyName(this object entityIdentityDescriber) 
{ 
    if(entityIdentityDescriber is EntityRestIdentityDescriber<IDType>) 
     return entityIdentityDescriber.propertyNameDescribingID(); 
    else 
     return "id"; 
} 
+0

Yeah ich dachte, dies früher tun, aber IDType ist undefiniert und so kann ich ' t teste ich wirklich, weil ich den Wert zur Laufzeit nicht kenne. Ich kann auch nicht die generische Einschränkung entfernen, weil sie woanders benötigt wird. Gibt es keinen anderen Weg als Vererbung und dynamischen Polymorphismus? –

+0

@SalmanHasratKhan Ehrlich gesagt, weiß ich nicht! –