static bool FindMethodWithoutParameters(object obj, string name, out Metadata.Method methodVirtual, out MethodInfo methodNative) { methodVirtual = null; methodNative = null; var provider = obj as Metadata.IMetadataProvider; if (provider != null) { //virtual, public methodVirtual = provider.MetadataGetMemberBySignature($"method:{name}()") as Metadata.Method; if (methodVirtual == null) { //native, non public try { methodNative = obj.GetType().GetMethod(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static, null, Array.Empty <Type>(), null); } catch { } } } else { //native, public try { methodNative = obj.GetType().GetMethod(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static, null, Array.Empty <Type>(), null); } catch { } } return(methodVirtual != null || methodNative != null); }
protected override void CreateMembers(List <Metadata.Member> created) { var method = CreateMethod(); if (method != null) { createdMethod = method; created.Add(method); } }
internal static object MethodInvoke(object obj, Metadata.Method methodVirtual, MethodInfo methodNative, object[] parameters) { if (methodVirtual != null) { return(methodVirtual.Invoke(methodVirtual.Static ? null : obj, parameters)); } else { return(methodNative.Invoke(methodNative.IsStatic ? null : obj, parameters)); } }
static bool FindMethodWithoutEqualParameterTypes(object obj, string name, object[] parameters, out Metadata.Method methodVirtual, out MethodInfo methodNative, out object[] newParameters) { methodVirtual = null; methodNative = null; newParameters = null; //!!!!ref, out support //!!!!default parameters //virtual, public var provider = obj as Metadata.IMetadataProvider; if (provider != null) { foreach (var member in provider.MetadataGetMembers()) { var method = member as Metadata.Method; if (method != null && method.Name == name) { var inputParams = method.GetInputParameters(); if (inputParams.Length == parameters.Length) { for (int nParam = 0; nParam < inputParams.Length; nParam++) { var demandedType = inputParams[nParam].Type.GetNetType(); var value = parameters[nParam]; if (value != null) { if (!demandedType.IsAssignableFrom(value.GetType()) && !MetadataManager.CanAutoConvertType(value.GetType(), demandedType)) { goto next_member; } } else { if (demandedType.IsValueType) { goto next_member; } } } //found { methodVirtual = method; newParameters = new object[inputParams.Length]; for (int nParam = 0; nParam < inputParams.Length; nParam++) { var demandedType = inputParams[nParam].Type.GetNetType(); var value = parameters[nParam]; if (value != null) { if (demandedType == value.GetType()) { newParameters[nParam] = value; } else if (demandedType.IsAssignableFrom(value.GetType())) { newParameters[nParam] = Convert.ChangeType(value, demandedType); } else { newParameters[nParam] = MetadataManager.AutoConvertValue(value, demandedType); } } } break; } } } next_member :; } } //native if (methodVirtual == null) { var bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static; if (provider == null) { bindingFlags |= BindingFlags.Public; } foreach (var method in obj.GetType().GetMethods(bindingFlags)) { if (method.Name == name) { var inputParams = new List <ParameterInfo>(); foreach (var p in method.GetParameters()) { if (!p.IsRetval) { inputParams.Add(p); } } if (inputParams.Count == parameters.Length) { for (int nParam = 0; nParam < inputParams.Count; nParam++) { var demandedType = inputParams[nParam].ParameterType; var value = parameters[nParam]; if (value != null) { if (!demandedType.IsAssignableFrom(value.GetType()) && !MetadataManager.CanAutoConvertType(value.GetType(), demandedType)) { goto next_member2; } } else { if (demandedType.IsValueType) { goto next_member2; } } } //found { methodNative = method; newParameters = new object[inputParams.Count]; for (int nParam = 0; nParam < inputParams.Count; nParam++) { var demandedType = inputParams[nParam].ParameterType; var value = parameters[nParam]; if (value != null) { if (demandedType == value.GetType()) { newParameters[nParam] = value; } else if (demandedType.IsAssignableFrom(value.GetType())) { newParameters[nParam] = Convert.ChangeType(value, demandedType); } else { newParameters[nParam] = MetadataManager.AutoConvertValue(value, demandedType); } } } break; } } } next_member2 :; } } return(methodVirtual != null || methodNative != null); }
internal static bool FindMethod(object obj, string name, object[] parameters, out Metadata.Method methodVirtual, out MethodInfo methodNative, out object[] newParameters) { if (parameters.Length != 0) { if (FindMethodWithEqualParameterTypes(obj, name, parameters, out methodVirtual, out methodNative)) { newParameters = parameters; return(true); } if (FindMethodWithoutEqualParameterTypes(obj, name, parameters, out methodVirtual, out methodNative, out newParameters)) { return(true); } } else { if (FindMethodWithoutParameters(obj, name, out methodVirtual, out methodNative)) { newParameters = Array.Empty <object>(); return(true); } } methodVirtual = null; methodNative = null; newParameters = null; return(false); }
static bool FindMethodWithEqualParameterTypes(object obj, string name, object[] parameters, out Metadata.Method methodVirtual, out MethodInfo methodNative) { methodVirtual = null; methodNative = null; var types = new Type[parameters.Length]; for (int n = 0; n < parameters.Length; n++) { if (parameters[n] == null) { return(false); } types[n] = parameters[n].GetType(); } var provider = obj as Metadata.IMetadataProvider; if (provider != null) { //virtual, public { string signature; var builder = new StringBuilder(); builder.Append("method:"); builder.Append(name); builder.Append('('); for (int n = 0; n < parameters.Length; n++) { var type = MetadataManager.GetTypeOfNetType(types[n]); if (type == null) { goto skip_virtual; } if (n != 0) { builder.Append(','); } builder.Append(type.Name); } builder.Append(')'); signature = builder.ToString(); methodVirtual = provider.MetadataGetMemberBySignature(signature) as Metadata.Method; skip_virtual :; } if (methodVirtual == null) { //native, non public try { methodNative = obj.GetType().GetMethod(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static, null, types, null); } catch { } } } else { //native, public try { methodNative = obj.GetType().GetMethod(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static, null, types, null); } catch { } } return(methodVirtual != null || methodNative != null); }
public override void NeedUpdateCreatedMembers() { base.NeedUpdateCreatedMembers(); createdMethod = null; }
public ReferenceValueType_Method(Metadata.Method member, object obj) : base(member, obj) { }