클래스 메서드와 동일한 서명을 사용하여 확장 메서드를 호출하는 방법을 찾았지만 그다지 우아하지는 않습니다. 확장 메서드를 가지고 놀 때 문서화되지 않은 동작을 발견했습니다. 샘플 코드 :
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 ()를 호출 할 때 예상되는 문자열 "Base GetDesc"대신 반환 문자열 "Extension 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 델리게이트를 많이 사용하지 않았으므로 더 경험이 많은 누군가가 그 부분을 알아낼 수있을 것입니다.