我只是在弄混C#4.0动态关键字,并对一件事感到好奇。
假设我有一个课程DynamicWeirdness : DynamicObject
在其中,我有一个名为reference
的字段,该字段的类型也为dynamic
。还有一个名为referencetype
的字段,其类型为Type
这是我的构造函数:
public DynamicWeirdness(object reference)
{
this.reference = reference;
this.referencetype = reference.GetType();
}
如果我尝试过:
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
if (binder.Name == "GetType" && args.Length == 0)
{
result = referencetype;
return true;
}
result = null;
return false;
}
当我调用
GetType()
对象的DynamicWeirdness
时,它只是忽略我的调用并返回{Name = "DynamicWeirdness" FullName = "Dynamic1.DynamicWeirdness"}
。为什么?我尝试使用
ToString()
,GetHashCode()
,并且发生相同的事情。 最佳答案
方法GetType()
,ToString()
和GetHashCode()
都在DynamicObject
上定义(因为它继承自System.Object
)。 .NET调用这些方法时,由于它们是在对象上定义的,因此它将直接调用它们,并且将跳过对TryInvokeMember
的调用。
如果尝试调用其他方法(例如Substring()
),则可以看到实际的效果,并且会看到确实调用了TryInvokeMember
上的DynamicWeirdness
。
您可以在TryInvokeMember
上创建一个新的DynamicWeirdness
方法,而不是覆盖GetType()
上的DynamicWeirdness
以返回其他类型。
public new Type GetType()
{
return this.referencetype;
}
对于
GetHashCode()
和ToString()
,您可以覆盖DynamicWeirdness
上的那些成员,因为它们被标记为虚拟成员。