我有这个简单的方法:
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标签,例如MemberTypes.Method,没有使用Method Info重载调用CacheDelegate方法,而是调用带有Member Info重载的CacheDelegate!所以它基本上只是一遍又一遍地反复呼唤自己。我在调用方法时尝试指定参数名称methodInfo:methodInfo,但Unity引擎告诉我最好的重载方法不包含名为methodInfo的参数。
我完全不知道为什么会这样。 任何帮助将不胜感激。
答案 0 :(得分:4)
过载分辨率的工作原理如下。
从名为on的类型开始,找到可在该类型上声明的方法集。
如果该集合为空,则尝试使用基本类型或声明的接口。继续向上移动层次结构,直到找到至少一个匹配的方法,否则错误。
在找到的集合中,使用最具体的方法。如果是平局就会出错。
因此,在这四个方法中,有三个在这个类中声明了。其中三个不适用。只留下public void CacheDelegate(Object obj, MemberInfo memberInfo)
作为要调用的正确类,因此调用它。
您可以使用((BaseType)this).CacheDelegate(obj, methodInfo);
强制进行所需的通话,因为基本类型只有一个CacheDelegate
重载可供选择。
答案 1 :(得分:1)
以下是解决问题的几种方法:
object ignoreMe
。这将迫使过载兼容,但大多数人都认为它远非优雅。new
隐藏方法,而不是覆盖。我不是100%确定在涉及方法隐藏时重载解析如何工作,但它应该使它使用正确的方法。请记住,这样做当然会删除它的多态性。