/* Types classification 0. Void 1. Numeric 1.1. Signed (sbyte, short, int, long); 1.2. Unsigned (byte, ushort, uint, ulong); 1.3. Real (float, double, decimal); 2. Non-numeric 2.1. Logical (bool); 2.2. Text (char, string); 2.3. Object (object); 2.4. Dynamic (dynamic); 2.5. Struct (struct); 2.6. Enumerable (enum); A. Value (stack) A.a. Numeric; A.b. Logical; A.c. Char; A.d. Struct; A.e. Enumerable; B. Reference (heap) B.a. Object; B.b. String; B.c. Delegate; B.d. Dynamic; */ /* Types description 1. Numeric 1.1. Signed 1.1.1. sbyte (SByte) : 8 bits (-128..127); 1.1.2. short (Int16) : 16 bits (-32768..32767); 1.1.3. int (Int32) : 32 bits (-2147483648..2147483647); 1.1.4. long (Int64) : 64 bit (-9223372036854775808..9223372036854775807); 1.2. Unsigned 1.2.1. byte (Byte) : 8 bits (0..255); 1.2.2. ushort (UInt16) : 16 bits (0..65535); 1.2.3. uint (UInt32) : 32 bits (0..4294967295); 1.2.4. ulong (UInt64) : 64 bits (0..18446744073709551615); 1.3. Real 1.3.1. float (Single) : 32 bits; 1.3.2. double (Double) : 64 bits; 1.3.3. decimal (Decimal) : 128 bits; 2. Non-numeric 2.1. Logical 2.1.1. bool (Boolean) : 8 bit (true / false); 2.2. Text 2.2.1. char (Char) : 16 bit (Unicode: UFT-8 / UTF-16 / UTF-32); 2.2.2. string (String); 2.3. Object 2.3.1. object (Object); 2.4. Dynamic 2.4.1. dynamic (Object); 2.5. Struct 2.5.1. struct; */ #endregion public static void DynamicUsingExample(dynamic data) { if (data == null) throw new NullReferenceException("data argument should not be null"); try { Type type; dynamic value; value = "Hello!"; type = value.GetType(); // System.String value = 123; type = value.GetType(); // System.Int32 value = true; type = value.GetType(); // System.Boolean Int32 v = 65; object obj = v; dynamic dyn = v; // deference between object and dynamic v = (Int32)obj; v = dyn; data.SentMessage(); // probably will be exception but code analyzer is OK ;) data.GrabTheDevilByTheHornsAndFuckHimUpTheAss(); } catch (Exception ex) { throw new ArgumentException("...: " + ex.Message); } }