public class MethodDelegateMatch ...{
/**//// <summary>
/// 判断某方法与某委托签名是否匹配。(.net 2.0)
/// </summary>
/// <remarks>
/// DelegateInfo类可以通过Microsoft.Cci命名空间下的类构造:)
/// </remarks>
/// <param name="methodInfo"></param>
/// <param name="delegateInfo"></param>
/// <returns>true:可匹配。false:匹配失败</returns>
public static bool IsMatchable(MethodInfo methodInfo, DelegateInfo delegateInfo) ...{
return IsReturnTypeMatchable(methodInfo, delegateInfo) &&
IsParamsMatchable(methodInfo, delegateInfo);
}
/**//// <summary>
/// 判断返回类型是否可匹配
/// </summary>
/// <remarks>
/// 在.net 2.0之前,要求返回类型相同。
///
/// 在.net 2.0中,仅要求方法的返回类型可以赋给委托签名中声明的返回类型,
/// 这样就允许方法返回签名中规定类型的子类。此谓之“协变”也。
/// </remarks>
/// <param name="methodInfo"></param>
/// <param name="delegateInfo"></param>
/// <returns>true:可匹配。false:匹配失败</returns>
private static bool IsReturnTypeMatchable(MethodInfo methodInfo, DelegateInfo delegateInfo) ...{
The mapping logic used before .net 2.0#region The mapping logic used before .net 2.0
// if (methodInfo.ReturnType == delegateInfo.ReturnType) {
// return true;
// }
// return false;
#endregion
The current mapping logic#region The current mapping logic
if (delegateInfo.ReturnType.IsAssignableFrom(methodInfo.ReturnType)) ...{
return true;
}
return false;
#endregion
}
/**//// <summary>
/// 判断参数列表是否匹配
/// </summary>
/// <remarks>
/// 在.net 2.0之前,要求参数列表中的每个参数的类型都分别相同。
///
/// 在.net 2.0中,仅要求委托签名中声明的各参数可分别赋给方法中声明的相应参数,
/// 这样就允许前者是后者的继承类。此谓之“协变”也。
/// </remarks>
/// <param name="methodInfo"></param>
/// <param name="delegateInfo"></param>
/// <returns>true:可匹配。false:匹配失败</returns>
private static bool IsParamsMatchable(MethodInfo methodInfo, DelegateInfo delegateInfo) ...{
ParameterInfo[] methodParameterInfos = methodInfo.GetParameters();
ParameterInfo[] delegateParameterInfos = delegateInfo.GetParameters();
if (delegateParameterInfos.Length != delegateParameterInfos.Length) ...{
return false;
}
for (int i = 0; i < methodParameterInfos.Length; i++) ...{
The mapping logic used before .net 2.0#region The mapping logic used before .net 2.0
// if(methodParameterInfos[i].ParameterType != delegateParameterInfos[i].ParameterType) {
// return false;
// }
#endregion
The current mapping logic#region The current mapping logic
if (!methodParameterInfos[i].ParameterType.IsAssignableFrom(delegateParameterInfos[i].ParameterType)) ...{
return false;
}
#endregion
}
return true;
}
}