
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;

}

}