【发布时间】:2016-02-02 00:14:05
【问题描述】:
我有这个简单的方法:
public void CacheDelegate(Object obj, MemberInfo memberInfo)
{
switch (memberInfo.MemberType)
{
case MemberTypes.Field:
var fieldInfo = (FieldInfo) memberInfo;
CacheDelegate(obj, fieldInfo);
break;
case MemberTypes.Property:
var propertyInfo = (PropertyInfo) memberInfo;
CacheDelegate(obj, propertyInfo);
break;
case MemberTypes.Method:
var methodInfo = (MethodInfo) memberInfo;
CacheDelegate(obj, methodInfo);
break;
default:
throw new Exception("Cannot create a delegate for MemberInfo provided.");
}
}
上面的方法解析了memberInfo的类型,并从下面调用了适用的方法:
public void CacheDelegate(Object obj, FieldInfo fieldInfo)
{
// Do stuff...
}
public void CacheDelegate(Object obj, PropertyInfo propertyInfo)
{
// Do stuff...
}
public sealed override void CacheDelegate(Object obj, MethodInfo methodInfo)
{
// Do stuff...
}
问题是最后一个case标签,case MemberTypes.Method,没有调用带有Method Info重载的CacheDelegate方法,而是调用带有Member Info重载的CacheDelegate!所以它基本上只是一遍又一遍地递归地调用自己。我尝试在调用方法时指定参数名称methodInfo:methodInfo,但是Unity引擎告诉我最好的重载方法不包含名为methodInfo的参数。
我不知道为什么会发生这种情况。 任何帮助将不胜感激。
【问题讨论】:
-
为什么最后一个方法被密封并覆盖了某些东西?
-
@DavidG 对于要密封的方法,基本方法需要是虚拟的或抽象的。要实现虚拟或抽象方法,需要重写它。删除 override 关键字将产生错误,“方法无法密封,因为它不是覆盖”。删除sealed 关键字将允许派生类型实现它们自己的方法版本。
-
@rafael-at-jags 我知道这意味着什么,我只是在暗示您没有给我们足够的上下文来正确回答。但你现在有了一个可行的答案。
-
@Rob 通过
base.…调用它会跳过虚拟调度并对基实现执行call而不是callvirt,强制转换为bast 类型将获得基于基的重载挑选,但仍然是一个虚拟电话。 -
你做错了吗?我无法通过类似的测试重现此行为。
标签: c# unity3d polymorphism