我已经找到了一种调用扩展方法的方法,该方法具有与类方法相同的签名,但是它看起来并不十分优雅。在使用扩展方法时,我注意到一些未记录的行为。样例代码:
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();
}
}
我注意到的是,如果我从扩展方法内部调用了第二个方法,即使存在一个也与签名匹配的类方法,它也会调用与签名匹配的扩展方法。例如,在上面的代码中,当我调用ExtFunc()时,依次调用ele.GetDesc(),我得到的返回字符串为“ Extension GetDesc”,而不是我们期望的字符串“ Base GetDesc”。
测试代码:
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
这使您可以随意在类方法和扩展方法之间来回跳动,但需要添加重复的“传递”方法才能进入所需的“作用域”。我称此范围为缺少更好的词。希望有人能让我知道它的真正含义。
您可能已经猜到了我的“传递”方法名称,我也曾想过将委托传递给他们的想法,希望一个或两个方法可以充当具有相同签名的多个方法的传递。不幸的是,一旦委托被解压缩,就不会总是选择类方法而不是扩展方法,即使从另一个扩展方法内部也是如此。“范围”不再重要。尽管我并没有非常多地使用Action和Func代表,所以也许更有经验的人可以弄清楚这一点。