using System; using System.Collections.Generic; using System.Dynamic; using System.Reflection; using System.Reflection.Emit; public class TestClass { public void MethodOut(string aa) { Console.WriteLine(aa); } } /// <summary> /// 这是一个定义属性,字段的重构类 /// </summary> public class DynamicDictionary : DynamicObject { // The inner dictionary. Dictionary<string, object> dictionary = new Dictionary<string, object>(); // This property returns the number of elements // in the inner dictionary. public int Count { get { return dictionary.Count; } } //***************以下是重写DynamicObject类的方法******************** //如果您尝试获取类中未定义的属性的值,则调用此方法。 public override bool TryGetMember( GetMemberBinder binder, out object result) { // 将属性名称转换为小写,使属性名称不区分大小写。 string name = binder.Name.ToLower(); // 如果在字典中找到属性名称,则将结果参数设置为属性值并返回true。 否则,返回false。 return dictionary.TryGetValue(name, out result); } // 如果您尝试设置类中未定义的属性的值,则调用此方法。 public override bool TrySetMember( SetMemberBinder binder, object value) { // 将属性名称转换为小写,使属性名称不区分大小写。 dictionary[binder.Name.ToLower()] = value; // 你总是可以给字典添加一个值,所以这个方法总是返回true。 return true; } } class Program { static void Main(string[] args) { //和Dictionary配合用法**************************** dynamic person = new DynamicDictionary(); person.FirstName = "Ellen"; person.LastName = "Adams"; person.sss = 55; Console.WriteLine(person.FirstName + " " + person.lastname); Console.WriteLine( "Number of dynamic properties:" + person.Count); int A = person.sss; //这里会报错,因为没有这个值 // Console.WriteLine(person.address); // //和反射配合用法**************************** dynamic sample2 = new TestClass(); sample2.MethodOut("qqqq"); //获取类型,这点和Var是一样的************************* String s = sample2.GetType().Name; dynamic dy = 123; String s1 = dy.GetType().Name; var sd = false; string dfg= sd.GetType().Name; } }