সমস্যা
C# একটি স্ট্রংলি-টাইপড ল্যাঙ্গুয়েজ — প্রতিটি ভেরিয়েবলের টাইপ কম্পাইল টাইমেই জানতে হয়। কিন্তু কখনো কখনো রানটাইমে টাইপ নির্ধারিত হয় (JSON পার্সিং, COM ইন্টারঅপ, রিফলেকশন, ডাইনামিক ল্যাঙ্গুয়েজ ইন্টারঅপ)।
সমাধান: dynamic কীওয়ার্ড
- কম্পাইলারকে বলে: "এই ভেরিয়েবলের টাইপ রানটাইমে ডিটারমাইন হবে"
- স্ট্যাটিক টাইপ চেকিং বাইপাস হয়
- সকল মেম্বার অ্যাক্সেস (মেথড, প্রপার্টি, অপারেটর) রানটাইমে রিজল্ভ হয়
- এরর কম্পাইল টাইমে না পাওয়া গিয়ে রানটাইমে ফেলা হয়
উদাহরণ
using System;
namespace DemoDynamicKeyword {
class Program {
static void Main(string[] args) {
dynamic MyDynamicVar = 100;
Console.WriteLine($"Value: {MyDynamicVar}, Type: {MyDynamicVar.GetType()}");
// Value: 100, Type: System.Int32
MyDynamicVar = "Hello World!!";
Console.WriteLine($"Value: {MyDynamicVar}, Type: {MyDynamicVar.GetType()}");
// Value: Hello World!!, Type: System.String
MyDynamicVar = true;
Console.WriteLine($"Value: {MyDynamicVar}, Type: {MyDynamicVar.GetType()}");
// Value: True, Type: System.Boolean
MyDynamicVar = DateTime.Now;
Console.WriteLine($"Value: {MyDynamicVar}, Type: {MyDynamicVar.GetType()}");
// Value: 1/15/2024, Type: System.DateTime
// ডাইনামিক মেথড কল (রানটাইমে রিজল্ভ)
MyDynamicVar = new { Name = "Test", Value = 42 };
Console.WriteLine(MyDynamicVar.Name); // Test
// অস্তিত্বহীন মেম্বার অ্যাক্সেস → RuntimeBinderException
try {
Console.WriteLine(MyDynamicVar.NonExistentProperty);
} catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex) {
Console.WriteLine($"Runtime Error: {ex.Message}");
}
}
}
}
আউটপুট:
Value: 100, Type: System.Int32 Value: Hello World!!, Type: System.String Value: True, Type: System.Boolean Value: 1/15/2024 10:30:45 AM, Type: System.DateTime Test Runtime Error: 'object' does not contain a definition for 'NonExistentProperty'
dynamic vs var
| বিষয় | var | dynamic |
|---|---|---|
| টাইপ ইনফারেন্স | কম্পাইল টাইম | রানটাইম |
| টাইপ পরিবর্তন | সম্ভব না | সম্ভব |
| IntelliSense | হ্যাঁ | না (রানটাইমে জানা যায়) |
| পারফরম্যান্স | নেটিভ (নো ওভারহেড) | धीম (DLR ওভারহেড) |
| এরর ধরার সময় | কম্পাইল টাইম | রানটাইম |
ব্যবহারের পরিস্থিতি
- JSON ডিসিরিয়ালাইজেশন:
dynamic data = JsonConvert.DeserializeObject(json); - COM ইন্টারঅপ: Excel, Word অটোমেশন
- রিফলেকশন簡易:
dynamic obj = Activator.CreateInstance(type); - IronPython/IronRuby ইন্টারঅপ
- Entity Framework ডাইনামিক কোয়েরি
সতর্কতা ও বেস্ট প্র্যাকটিস
- অতিশয় ব্যবহার করবেন না — টাইপ সেফটি হারায়, রিফ্যাক্টরিং কঠিন হয়
- পাবলিক API-তে
dynamicরিটার্ন/প্যারামিটার এড়িয়ে চলুন - পরফরম্যান্স-ক্রিটিক্যাল পথে ব্যবহার করবেন না
ExpandoObjectব্যবহার করে রানটাইমে প্রপার্টি যোগ/বাদ দেওয়া যায়
ExpandoObject উদাহরণ
using System.Dynamic;
dynamic expando = new ExpandoObject();
expando.Name = "Dynamic";
expando.Age = 25;
expando.SayHello = new Action(() => Console.WriteLine($"Hi, {expando.Name}"));
expando.SayHello(); // Hi, Dynamic