เพิ่มเติมบางวิธีการเรียกใช้ด้วยรหัสกรรไกร สมมติว่าคุณมีคลาสที่คล้ายกับ
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
สมมติว่าตอนรันไทม์คุณมีFooContent
หากคุณสามารถผูกเวลารวบรวมคุณจะต้องการ
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
อย่างไรก็ตามคุณไม่สามารถทำได้ในขณะใช้งานจริง ในการทำเช่นนี้ที่ runtime คุณต้องทำตามบรรทัดของ
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
เพื่อเรียกใช้แบบไดนามิก Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown( (dynamic) dynamicList)
หมายเหตุการใช้งานdynamic
ในการเรียกใช้เมธอด ที่รันไทม์dynamicList
จะเป็นList<FooContent>
(นอกจากนี้ยังเป็นIEnumerable<FooContent>
) เนื่องจากแม้กระทั่งการใช้งานของแบบไดนามิกยังคงหยั่งรากไปเป็นภาษาที่พิมพ์อย่างยิ่ง binder เวลาทำงานจะเลือกMarkdown
วิธีการที่เหมาะสม หากไม่มีประเภทที่ตรงกันทั้งหมดก็จะค้นหาวิธีการพารามิเตอร์วัตถุและถ้าไม่ตรงกับข้อยกเว้น Binder รันไทม์จะถูกยกขึ้นแจ้งเตือนว่าไม่มีวิธีการที่ตรงกับ
สิ่งที่เห็นได้ชัดเจนจากวิธีนี้คือการสูญเสียความปลอดภัยอย่างมากในเวลารวบรวม อย่างไรก็ตามรหัสตามบรรทัดเหล่านี้จะช่วยให้คุณทำงานในแง่ที่เป็นพลวัตมากว่า ณ รันไทม์ยังคงพิมพ์อย่างเต็มที่ตามที่คุณคาดหวัง