Dynamic invoke of a method using named parameters

后端 未结 3 987
耶瑟儿~
耶瑟儿~ 2020-12-16 07:41

We\'re currently using .NET 3.5 and part of our application uses dynamic invocation (using MethodBase.Invoke)

I am wondering if it is possible to mix in Named Parame

3条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-16 08:00

    You can use code like this:

    public static class ReflectionExtensions {
    
        public static object InvokeWithNamedParameters(this MethodBase self, object obj, IDictionary namedParameters) { 
            return self.Invoke(obj, MapParameters(self, namedParameters));
        }
    
        public static object[] MapParameters(MethodBase method, IDictionary namedParameters)
        {
            string[] paramNames = method.GetParameters().Select(p => p.Name).ToArray();
            object[] parameters = new object[paramNames.Length];
            for (int i = 0; i < parameters.Length; ++i) 
            {
                parameters[i] = Type.Missing;
            }
            foreach (var item in namedParameters)
            {
                var paramName = item.Key;
                var paramIndex = Array.IndexOf(paramNames, paramName);
                if (paramIndex >= 0)
                {
                    parameters[paramIndex] = item.Value;
                }
            }
            return parameters;
        }
    }
    

    And then call it like this:

    var parameters = new Dictionary();
    // Add parameters ...
    methodInfo.InvokeWithNamedParameters(obj, parameters);
    

提交回复
热议问题