Beispiel #1
0
        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);
        }
Beispiel #2
0
        protected override void CreateMembers(List <Metadata.Member> created)
        {
            var method = CreateMethod();

            if (method != null)
            {
                createdMethod = method;
                created.Add(method);
            }
        }
Beispiel #3
0
 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));
     }
 }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        public override void NeedUpdateCreatedMembers()
        {
            base.NeedUpdateCreatedMembers();

            createdMethod = null;
        }
Beispiel #8
0
 public ReferenceValueType_Method(Metadata.Method member, object obj)
     : base(member, obj)
 {
 }