public FuncExtension(object extension, MethodInfo method, PermissionSet permissions) {
Debug.Assert(extension != null);
Debug.Assert(method != null);
this.extension = extension;
this.method = method;
this.permissions = permissions;
XPathResultType returnType = GetXPathType(method.ReturnType);
ParameterInfo[] parameters = method.GetParameters();
int minArgs = parameters.Length;
int maxArgs = parameters.Length;
this.typeCodes = new TypeCode[parameters.Length];
XPathResultType[] argTypes = new XPathResultType[parameters.Length];
bool optionalParams = true; // we allow only last params be optional. Set false on the first non optional.
for (int i = parameters.Length - 1; 0 <= i; i --) { // Revers order is essential: counting optional parameters
typeCodes[i] = Type.GetTypeCode(parameters[i].ParameterType);
argTypes[i] = GetXPathType(parameters[i].ParameterType);
if(optionalParams) {
if(parameters[i].IsOptional) {
minArgs --;
} else {
optionalParams = false;
}
}
}
base.Init(minArgs, maxArgs, returnType, argTypes);
}