ฉันพบวิธีเรียกใช้เมธอดส่วนขยายที่มีลายเซ็นเดียวกันกับเมธอดคลาส แต่ดูเหมือนจะไม่สวยหรูมากนัก เมื่อเล่นกับวิธีการขยายฉันสังเกตเห็นพฤติกรรมบางอย่างที่ไม่มีเอกสาร โค้ดตัวอย่าง:
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("");
bt.ValDesc("ext");
bt.ValDesc("ext def");
bt.ValDesc("ext base");
วิธีนี้ช่วยให้คุณสามารถย้อนกลับไปมาระหว่างเมธอดคลาสและเมธอดส่วนขยายได้ตามต้องการ แต่ต้องการการเพิ่มเมธอด "pass-through" ที่ซ้ำกันเพื่อให้คุณเข้าสู่ "ขอบเขต" ที่คุณต้องการ ฉันเรียกมันว่าขอบเขตที่นี่เพราะขาดคำที่ดีกว่า หวังว่าจะมีคนแจ้งให้เราทราบว่าจริงๆแล้วมันเรียกว่าอะไร
คุณอาจเดาได้จากชื่อเมธอด "pass-through" ของฉันที่ฉันยังเล่นด้วยความคิดที่จะส่งผู้ได้รับมอบหมายไปให้พวกเขาด้วยความหวังว่าวิธีการเดียวหรือสองวิธีสามารถทำหน้าที่เป็น pass-through สำหรับหลายวิธีที่มีลายเซ็นเดียวกัน น่าเสียดายที่มันไม่ได้เป็นเหมือนครั้งที่ผู้ร่วมประชุมถูกคลายแพ็ก แต่จะเลือกเมธอดคลาสมากกว่าเมธอดส่วนขยายแม้ว่าจะอยู่ในเมธอดส่วนขยายอื่นก็ตาม "ขอบเขต" ไม่สำคัญอีกต่อไป ฉันไม่ได้ใช้ตัวแทน Action และ Func มากนัก แต่บางทีอาจมีใครบางคนที่มีประสบการณ์มากกว่าสามารถคิดส่วนนั้นออกได้