我讨厌这样给出“精辟”的答案,因为它的信息量不是很大,但这确实是“如果你需要它,你就会知道”的情况。
很少需要在应用程序甚至大多数库代码中实现动态对象。该接口适用于实现只能用作动态对象的类的人;例如,如果你想在你的对象上实现类似 Javascript 的行为。您可以在此类对象上调用您想要的任何属性或方法,它会编译。由您在运行时的实现来确定给定的调用是否有效。
一个完全没有意义但具有描述性的示例是一个根据星期几决定哪些属性有效的类:
public class WeekendObject : DynamicObject
{
Dictionary<string, object> propertybag = new Dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
{
if (name.StartsWith("Sunday"))
{
return propertybag.TryGetValue(name, out result);
}
}
else
{
if (!name.StartsWith("Sunday"))
{
return propertybag.TryGetValue(name, out result);
}
}
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
{
if (name.StartsWith("Sunday"))
{
propertybag[binder.Name.ToLower()] = value;
return true;
}
}
else
{
if (!name.StartsWith("Sunday"))
{
propertybag[binder.Name.ToLower()] = value;
return true;
}
}
return false;
}
}