Bir sınıf yöntemiyle aynı imzaya sahip bir uzantı yöntemini çağırmanın bir yolunu buldum, ancak çok zarif görünmüyor. Uzantı yöntemleriyle uğraşırken bazı belgelenmemiş davranışlar fark ettim. Basit kod:
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();
}
}
Fark ettiğim şey, bir uzantı yönteminin içinden ikinci bir yöntemi çağırırsam, imzayla eşleşen bir sınıf yöntemi olsa bile imzayla eşleşen uzantı yöntemini çağıracaktı. Örneğin yukarıdaki kodda, sırayla ele.GetDesc () 'i çağıran ExtFunc ()' ı çağırdığımda, beklediğimiz "Temel GetDesc" dizesi yerine "Uzantı GetDesc" dönüş dizesini alıyorum.
Kodu test etmek:
var bt = new BaseTest();
bt.ValDesc("");
bt.ValDesc("ext");
bt.ValDesc("ext def");
bt.ValDesc("ext base");
Bu, sınıf yöntemleri ve genişletme yöntemleri arasında istediğiniz zaman gidip gelmenize izin verir, ancak sizi istediğiniz "kapsam" a sokmak için yinelenen "geçiş" yöntemlerinin eklenmesini gerektirir. Daha iyi bir kelime olmadığı için burada buna kapsam diyorum. Umarım birisi bana gerçekte ne dendiğini bildirebilir.
Tek bir yöntemin veya iki yöntemin aynı imzaya sahip birden çok yöntem için geçiş işlevi görebileceği umuduyla, delegeleri onlara iletme fikriyle de oynadığım "geçiş" yöntem isimlerimden tahmin etmiş olabilirsiniz. Maalesef, temsilci paketinden çıkarıldıktan sonra, başka bir uzantı yönteminin içinden bile olsa, her zaman uzantı yöntemi yerine sınıf yöntemini seçti. "Kapsam" artık önemli değil. Action and Func delegelerini pek kullanmadım, bu yüzden belki daha deneyimli biri bu kısmı çözebilir.