80:20の法則に従って20を説明して80をわかった気になってもらうdynamicキーワード

https://tocsworld.wordpress.com/2014/05/29/c%E3%81%A7%E3%81%AE%E5%8B%95%E7%9A%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/
素晴らしい解説。

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が無効なことに注意。
}
}
}