|
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace PoC.Web.Services.Utilities
{
internal class ReflectionUtil
{
public static MethodInfo FindMethod(Type inType, string methodName, object[] args, HttpVerb verb)
{
int matchMethodCounter = 0;
MethodInfo retMethod = null;
foreach (System.Reflection.MethodInfo method in inType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase))
{
bool isMatch = true;
bool isExactMatch = true;
try
{
if (method.GetCustomAttributes(typeof(ReSTMethod), false).Length == 0) continue;
bool isVerbSupported = false;
foreach (ReSTMethod methodAttrib in (ReSTMethod[])method.GetCustomAttributes(typeof(ReSTMethod), false))
{
isVerbSupported |= methodAttrib.Verb == verb;
}
if (!isVerbSupported) continue;
if (string.Compare(method.Name, methodName, StringComparison.OrdinalIgnoreCase) != 0) continue;
ParameterInfo[] methodParam = method.GetParameters();
if (methodParam.Length == 0 && args.Length == 0) return method;
//if (methodParam.Length == 0) throw new InvalidOperationException("Method doesn't support any parameter");
//No support for "params"
if (methodParam[methodParam.Length - 1].GetCustomAttributes(typeof(ParamArrayAttribute), false).Length > 0)
throw new InvalidOperationException("Param Array not allowed.");
if (methodParam.Length > args.Length)
{
object[] resizeArgs = new object[args.Length];
System.Array.Copy(args, resizeArgs, args.Length);
args = resizeArgs;
}
for (int i = 0; i < methodParam.Length; i++)
{
Type paramType = methodParam[i].ParameterType;
object paramValue = args[i];
if ((paramValue == null && paramType.IsValueType)
|| (paramValue != null && !paramType.IsAssignableFrom(paramValue.GetType())))
{
isMatch = false;
break;
}
if (paramValue == null || paramType != paramValue.GetType())
{
isExactMatch = false;
}
}
}
catch (InvalidCastException)
{
isMatch = false;
}
if (isMatch)
{
if(isExactMatch)
return method;
++matchMethodCounter;
retMethod = method;
if (matchMethodCounter > 0) throw new AmbiguousMatchException("Ambiguous action.");
}
}
return retMethod;
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.