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();
}