dynamicObject
public class WroxDynamicObject : DynamicObject { private Dictionary<string, object> _dynamicData = new Dictionary<string, object>(); /// <summary> /// 获取成员值的操作提供实现 /// </summary> /// <param name="binder"></param> /// <param name="result"></param> /// <returns></returns> public override bool TryGetMember(GetMemberBinder binder, out object result) { bool success = false; result = null; if (_dynamicData.ContainsKey(binder.Name)) { result = _dynamicData[binder.Name]; success = true; } else { result = "Property Not Found!"; success = false; } return success; } /// <summary> /// 设置成员值的操作提供实现 /// </summary> /// <param name="binder"></param> /// <param name="value"></param> /// <returns></returns> public override bool TrySetMember(SetMemberBinder binder, object value) { _dynamicData[binder.Name] = value; return true; } /// <summary> /// 调用成员的操作提供实现 /// </summary> /// <param name="binder"></param> /// <param name="args"></param> /// <param name="result"></param> /// <returns></returns> public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { dynamic method = _dynamicData[binder.Name]; result = method((DateTime)args[0]); return result != null; } private Dictionary<int, object> _dynamicIndex = new Dictionary<int, object>(); /// <summary> /// 为按索引获取值的操作提供实现 /// </summary> /// <param name="binder"></param> /// <param name="indexes"></param> /// <param name="result"></param> /// <returns></returns> public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) { int index = (int)indexes[0]; bool success = false; if (_dynamicIndex.ContainsKey(index)) { result = _dynamicIndex[index]; success = true; } else { result = "Not Found Index"; } return success; } /// <summary> /// 为按索引设置值的操作提供实现 /// </summary> /// <param name="binder"></param> /// <param name="indexes"></param> /// <param name="value"></param> /// <returns></returns> public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) { _dynamicIndex[(int)indexes[0]] = value; return true; } }
public static void Main() { dynamic wroxDyn = new WroxDynamicObject(); wroxDyn.FirstName = "Bugs"; wroxDyn.LastName = "Bunny"; Console.WriteLine(wroxDyn.GetType()); Console.WriteLine("{0} {1}", wroxDyn.FirstName, wroxDyn.LastName); Func<DateTime, string> GetTomorrow = today => today.AddDays(1).ToShortDateString(); wroxDyn.GetTomorrowDate = GetTomorrow; Console.WriteLine("Tomorrow is {0}", wroxDyn.GetTomorrowDate(DateTime.Now)); wroxDyn[0] = 1; Console.WriteLine(wroxDyn[0]); Console.Read(); }