public Type retnType; //todo can probably always set this to typeof(float) public SignatureAttribute(params Type[] signature) { signatureString = ""; if (signature != null && signature.Length > 0) { retnType = signature[signature.Length - 1]; signatureString += MethodPointerUtils.FilterFloatTypeName(retnType.Name) + " Fn("; parameterTypes = new Type[signature.Length - 1]; for (int i = 0; i < parameterTypes.Length; i++) { parameterTypes[i] = signature[i]; signatureString += MethodPointerUtils.FilterFloatTypeName(signature[i].Name); if (i != parameterTypes.Length - 1) { signatureString += ", "; } } signatureString += ")"; } }
//todo probably add an attribute requirement as well to narrow search space even more private static void FindPublicStaticMethods() { methodSet = new List <MethodInfo>(); for (int i = 0; i < filteredAssemblies.Count; i++) { var types = filteredAssemblies[i].GetTypes(); for (int typeIndex = 0; typeIndex < types.Length; typeIndex++) { var methods = types[typeIndex].GetMethods(BindingFlags.Static | BindingFlags.Public); for (int methodIdx = 0; methodIdx < methods.Length; methodIdx++) { MethodInfo info = methods[methodIdx]; if (info.GetCustomAttributes(true).Length > 0 && !info.IsDefined(typeof(ExtensionAttribute), true) && !info.IsGenericMethod && !info.IsGenericMethodDefinition) { pointerLookup[MethodPointerUtils.CreateSignature(info)] = CreateDelegate(info); } methodSet.AddRange(methods); } } } }
public AbstractMethodPointer(MethodInfo info) { signature = MethodPointerUtils.CreateSignature(info); original = Reflector.FindDelegateWithSignature(signature); SetFromDelegate(original); }