raf*_*ags 5 c# polymorphism unity-game-engine
我有这个简单的方法:
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.");
}
}
Run Code Online (Sandbox Code Playgroud)
上面的方法解析了 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...
}
Run Code Online (Sandbox Code Playgroud)
问题是最后一个 case 标签 case MemberTypes.Method 没有调用带有 Method Info 重载的 CacheDelegate 方法,而是调用带有 Member Info 重载的 CacheDelegate !所以它基本上只是递归地一遍又一遍地调用自己。我尝试在调用方法时指定参数名称 methodInfo: methodInfo,但是 Unity 引擎告诉我最好的重载方法不包含名为 methodInfo 的参数。
我很不明白为什么会这样。任何帮助将不胜感激。
重载解析的工作原理如下。
从调用的类型开始,找到在该类型上声明的可以使用的方法集。
如果该集合为空,则尝试对声明的基类型或接口进行相同的操作。继续沿层次结构向上移动,直到找到至少一个匹配的方法,否则会出错。
在找到的集合中,使用最具体的方法。如果平局则出错。
因此,在这四个方法中,有三个是在此类中声明的。这三者中有两个不适用。这样就只剩下public void CacheDelegate(Object obj, MemberInfo memberInfo)明确要调用的正确类了,所以它被调用了。
您可以使用((BaseType)this).CacheDelegate(obj, methodInfo);强制进行所需的调用,因为基本类型只有一种CacheDelegate重载可供选择。