Dynamic Binding (Late Binding) คือการตัดสินใจเรียก Member (Method/Property) ที่ **Runtime** โดยใช้คีย์เวิร์ด dynamic (C# 4.0+)
ตัวอย่าง: หลีกเลี่ยง Anonymous Type Restriction
using System;
class Program
{
// Anonymous Type ไม่มีชื่อ Type ที่เรียกใช้ได้นอก Method
// แต่ dynamic ช่วยให้ Return ได้
public dynamic GetAnonymousType()
{
return new
{
StudentName = "Jack",
Subject = "Maths"
};
}
static void Main()
{
var p = new Program();
dynamic student = p.GetAnonymousType();
// เข้าถึง Property ได้เลย ไม่ต้อง Cast
Console.WriteLine("Name: " + student.StudentName);
Console.WriteLine("Subject: " + student.Subject);
// student.UnknownProperty; // RuntimeBinderException (ไม่ Error ตอน Compile)
}
}
Dynamic Binding vs Reflection
| คุณสมบัติ | dynamic | Reflection |
|---|---|---|
| Syntax | Simple (obj.Method()) | Complex (type.GetMethod().Invoke()) |
| Performance | ดีกว่า (DLR Caching) | ช้ากว่า |
| Readability | สูง | ต่ำ |
| IntelliSense | ไม่มี | ไม่มี |
ใช้ dynamic เมื่อไหร่
- Interop: COM, IronPython, JavaScript
- JSON/XML Dynamic Parsing
- Anonymous Types ข้าม Method Boundary
- Plugin/Scripting Systems
⚠️ ข้อควรระวัง
- Error หาที่ Runtime (ไม่มี Compile-time Safety)
- Performance Overhead (DLR)
- ไม่มี IntelliSense/Refactoring Support
- ใช้เฉพาะเมื่อจำเป็นจริง - ปกติใช้ Static Typing
ExpandoObject (Dynamic Object สร้างเอง)
using System.Dynamic;
dynamic obj = new ExpandoObject();
obj.Name = "John";
obj.Age = 30;
obj.SayHello = new Action(() => Console.WriteLine("Hi " + obj.Name));
obj.SayHello(); // Hi John