/// <summary> /// 为获取成员值的操作提供实现。从 <see cref="T:System.Dynamic.DynamicObject"/> 类派生的类可以重写此方法,以便为诸如获取属性值这样的操作指定动态行为。 /// </summary> /// <returns> /// 如果此操作成功,则为 true;否则为 false。如果此方法返回 false,则该语言的运行时联编程序将决定行为。(大多数情况下,将引发运行时异常。) /// </returns> /// <param name="binder">提供有关调用了动态操作的对象的信息。binder.Name 属性提供针对其执行动态操作的成员的名称。例如,对于 Console.WriteLine(sampleObject.SampleProperty) 语句(其中 sampleObject 是派生自 <see cref="T:System.Dynamic.DynamicObject"/> 类的类的一个实例),binder.Name 将返回“SampleProperty”。binder.IgnoreCase 属性指定成员名称是否区分大小写。</param><param name="result">获取操作的结果。例如,如果为某个属性调用该方法,则可以为 <paramref name="result"/> 指派该属性值。</param> public override bool TryGetMember(GetMemberBinder binder, out object result) { var name = binder.Name; if (base.TryGetMember(binder, out result) && (null != result)) return true; result = new ZoneOnDemand(_zoneFactory, this, name); TrySetMemberImpl(name, result); return true; }
/// <summary> /// 为获取成员值的操作提供实现。从 <see cref="T:System.Dynamic.DynamicObject"/> 类派生的类可以重写此方法,以便为诸如获取属性值这样的操作指定动态行为。 /// </summary> /// <returns> /// 如果此操作成功,则为 true;否则为 false。如果此方法返回 false,则该语言的运行时联编程序将决定行为。(大多数情况下,将引发运行时异常。) /// </returns> /// <param name="binder">提供有关调用了动态操作的对象的信息。binder.Name 属性提供针对其执行动态操作的成员的名称。例如,对于 Console.WriteLine(sampleObject.SampleProperty) 语句(其中 sampleObject 是派生自 <see cref="T:System.Dynamic.DynamicObject"/> 类的类的一个实例),binder.Name 将返回“SampleProperty”。binder.IgnoreCase 属性指定成员名称是否区分大小写。</param><param name="result">获取操作的结果。例如,如果为某个属性调用该方法,则可以为 <paramref name="result"/> 指派该属性值。</param> public override bool TryGetMember(GetMemberBinder binder, out object result) { var name = binder.Name; if (base.TryGetMember(binder, out result) && (null != result)) { return(true); } result = new ZoneOnDemand(_zoneFactory, this, name); TrySetMemberImpl(name, result); return(true); }
/*/// <summary> * /// 为获取成员值的操作提供实现。从 <see cref="T:System.Dynamic.DynamicObject"/> 类派生的类可以重写此方法,以便为诸如获取属性值这样的操作指定动态行为。 * /// </summary> * /// <returns> * /// 如果此操作成功,则为 true;否则为 false。如果此方法返回 false,则该语言的运行时联编程序将决定行为。(大多数情况下,将引发运行时异常。) * /// </returns> * /// <param name="binder">提供有关调用了动态操作的对象的信息。binder.Name 属性提供针对其执行动态操作的成员的名称。例如,对于 Console.WriteLine(sampleObject.SampleProperty) 语句(其中 sampleObject 是派生自 <see cref="T:System.Dynamic.DynamicObject"/> 类的类的一个实例),binder.Name 将返回“SampleProperty”。binder.IgnoreCase 属性指定成员名称是否区分大小写。</param><param name="result">获取操作的结果。例如,如果为某个属性调用该方法,则可以为 <paramref name="result"/> 指派该属性值。</param> * public override bool TryGetMember(GetMemberBinder binder, out object result) * { * return TryGetMemberImpl(binder.Name, out result); * }*/ /// <summary> /// 尝试获取成员值。 /// </summary> /// <param name="name">成员名称。</param> /// <param name="result">成员值。</param> /// <returns>如果成功返回true,否则返回false。</returns> protected override bool TryGetMemberImpl(string name, out object result) { var parentMember = ((dynamic)_parent)[name]; if (parentMember == null) { result = new ZoneOnDemand(_zoneFactory, _parent, name); return(true); } result = parentMember; return(true); }
/*/// <summary> /// 为获取成员值的操作提供实现。从 <see cref="T:System.Dynamic.DynamicObject"/> 类派生的类可以重写此方法,以便为诸如获取属性值这样的操作指定动态行为。 /// </summary> /// <returns> /// 如果此操作成功,则为 true;否则为 false。如果此方法返回 false,则该语言的运行时联编程序将决定行为。(大多数情况下,将引发运行时异常。) /// </returns> /// <param name="binder">提供有关调用了动态操作的对象的信息。binder.Name 属性提供针对其执行动态操作的成员的名称。例如,对于 Console.WriteLine(sampleObject.SampleProperty) 语句(其中 sampleObject 是派生自 <see cref="T:System.Dynamic.DynamicObject"/> 类的类的一个实例),binder.Name 将返回“SampleProperty”。binder.IgnoreCase 属性指定成员名称是否区分大小写。</param><param name="result">获取操作的结果。例如,如果为某个属性调用该方法,则可以为 <paramref name="result"/> 指派该属性值。</param> public override bool TryGetMember(GetMemberBinder binder, out object result) { return TryGetMemberImpl(binder.Name, out result); }*/ /// <summary> /// 尝试获取成员值。 /// </summary> /// <param name="name">成员名称。</param> /// <param name="result">成员值。</param> /// <returns>如果成功返回true,否则返回false。</returns> protected override bool TryGetMemberImpl(string name, out object result) { var parentMember = ((dynamic)_parent)[name]; if (parentMember == null) { result = new ZoneOnDemand(_zoneFactory, _parent, name); return true; } result = parentMember; return true; }