namespace DynamicTestConsoleApp
{
using System;
using System.Text;
public class TestDynamicKeyword
{
public static void Sample()
{
// dynamicキーワードのテスト
// objは「ダイナミック型」として実行時に型情報を評価される
dynamic str = "This type is string";
// 1.存在しないプロパティにアクセスしてもコンパイルエラーにはならない
try
{
str.CallNonExistingMethod();
}
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException e)
{
// ただし、存在しない型なので実行時に例外がスローされる
Console.WriteLine("1: " + e.Message);
}
// 2.同一オブジェクトに、別の型のオブジェクトも代入できる
str = new StringBuilder("This type is stringbuilder.");
// 3.もちろん型名はちゃんとその型になっている
Console.WriteLine("3: " + str.GetType());
// 4.varはコンパイル時に型を推定するが、dynamicなオブジェクトを入れると
// それはdynamicキーワードで受けたのと同じことになる。
var copiedVarObject = str;
Console.WriteLine("4: " + copiedVarObject.GetType());
// 5.キーワードが"dynamic"で宣言されたかどうかを取得する方法はない
// 6.object型に対するメリットは例えば下記
object num = 10;
// num *= 10; <- これがコンパイルエラーになる。
// 明示的にキャストをすればエラーにならない。
num = (int)num * 10;
// dynamicならキャストも不要。
dynamic dynamicNum = 10;
dynamicNum *= 10;
// 7.ただintellisenseが無効なことに注意。
}
}
}