public InternalMethInfo(System.Reflection.MethodInfo target, ContextMethodAttribute binding) { _method = new Lazy <ContextCallableDelegate <TInstance> >(() => { var isFunc = target.ReturnType != typeof(void); return(isFunc ? CreateFunction(target) : CreateProcedure(target)); }); MethodInfo = CreateMetadata(target, binding); }
private static MethodInfo CreateMetadata(System.Reflection.MethodInfo target, ContextMethodAttribute binding) { var parameters = target.GetParameters(); var isFunc = target.ReturnType != typeof(void); var argNum = parameters.Length; var paramDefs = new ParameterDefinition[argNum]; for (int i = 0; i < argNum; i++) { var pd = new ParameterDefinition(); if (parameters[i].GetCustomAttributes(typeof(ByRefAttribute), false).Length != 0) { if (parameters[i].ParameterType != typeof(IVariable)) { throw new InvalidOperationException("Attribute ByRef can be applied only on IVariable parameters"); } pd.IsByValue = false; } else { pd.IsByValue = true; } if (parameters[i].IsOptional) { pd.HasDefaultValue = true; pd.DefaultValueIndex = ParameterDefinition.UNDEFINED_VALUE_INDEX; } paramDefs[i] = pd; } var scriptMethInfo = new ScriptEngine.Machine.MethodInfo(); scriptMethInfo.IsFunction = isFunc; scriptMethInfo.IsExport = true; scriptMethInfo.IsDeprecated = binding.IsDeprecated; scriptMethInfo.ThrowOnUseDeprecated = binding.ThrowOnUse; scriptMethInfo.Name = binding.GetName(); scriptMethInfo.Alias = binding.GetAlias(target.Name); scriptMethInfo.Params = paramDefs; return(scriptMethInfo); }