Ich habe einen Weg gefunden, eine Erweiterungsmethode mit derselben Signatur wie eine Klassenmethode aufzurufen, aber sie scheint nicht sehr elegant zu sein. Beim Herumspielen mit Erweiterungsmethoden bemerkte ich ein undokumentiertes Verhalten. Beispielcode:
public static class TestableExtensions
{
public static string GetDesc(this ITestable ele)
{
return "Extension GetDesc";
}
public static void ValDesc(this ITestable ele, string choice)
{
if (choice == "ext def")
{
Console.WriteLine($"Base.Ext.Ext.GetDesc: {ele.GetDesc()}");
}
else if (choice == "ext base" && ele is BaseTest b)
{
Console.WriteLine($"Base.Ext.Base.GetDesc: {b.BaseFunc()}");
}
}
public static string ExtFunc(this ITestable ele)
{
return ele.GetDesc();
}
public static void ExtAction(this ITestable ele, string choice)
{
ele.ValDesc(choice);
}
}
public interface ITestable
{
}
public class BaseTest : ITestable
{
public string GetDesc()
{
return "Base GetDesc";
}
public void ValDesc(string choice)
{
if (choice == "")
{
Console.WriteLine($"Base.GetDesc: {GetDesc()}");
}
else if (choice == "ext")
{
Console.WriteLine($"Base.Ext.GetDesc: {this.ExtFunc()}");
}
else
{
this.ExtAction(choice);
}
}
public string BaseFunc()
{
return GetDesc();
}
}
Was mir auffiel, war, dass wenn ich eine zweite Methode innerhalb einer Erweiterungsmethode aufrief, diese die Erweiterungsmethode aufrief, die mit der Signatur übereinstimmte, selbst wenn es eine Klassenmethode gab, die auch mit der Signatur übereinstimmte. Wenn ich beispielsweise im obigen Code ExtFunc () aufrufe, das wiederum ele.GetDesc () aufruft, erhalte ich die Rückgabezeichenfolge "Extension GetDesc" anstelle der erwarteten Zeichenfolge "Base GetDesc".
Testen des Codes:
var bt = new BaseTest();
bt.ValDesc("");
//Output is Base.GetDesc: Base GetDesc
bt.ValDesc("ext");
//Output is Base.Ext.GetDesc: Extension GetDesc
bt.ValDesc("ext def");
//Output is Base.Ext.Ext.GetDesc: Extension GetDesc
bt.ValDesc("ext base");
//Output is Base.Ext.Base.GetDesc: Base GetDesc
Auf diese Weise können Sie nach Belieben zwischen Klassenmethoden und Erweiterungsmethoden hin- und herwechseln, müssen jedoch doppelte "Pass-Through" -Methoden hinzufügen, um in den gewünschten "Bereich" zu gelangen. Ich nenne es hier Spielraum, weil es kein besseres Wort gibt. Hoffentlich kann mich jemand wissen lassen, wie es eigentlich heißt.
Vielleicht haben Sie anhand meiner "Pass-Through" -Methodennamen erraten, dass ich auch mit der Idee gespielt habe, Delegierte an sie weiterzugeben, in der Hoffnung, dass eine oder zwei Methoden als Pass-Through für mehrere Methoden mit derselben Signatur fungieren könnten. Leider sollte es nicht so sein, dass der Delegat nach dem Entpacken immer die Klassenmethode gegenüber der Erweiterungsmethode auswählte, selbst innerhalb einer anderen Erweiterungsmethode. "Umfang" spielte keine Rolle mehr. Ich habe Action- und Func-Delegierte allerdings nicht sehr oft eingesetzt, sodass vielleicht jemand mit mehr Erfahrung diesen Teil herausfinden könnte.