示例#1
0
        private BfMethod GetBfMethod(MethodReference methodReference)
        {
            var bfType  = _cache.GetBfType(((TypeSpecification)methodReference.DeclaringType).ElementType);
            var hashSet = new HashSet <string>();

            BfMethod bfMethod = null;

            if (bfType != null)
            {
                bfType.GetTypeDefinition().GenericParameters.ForEach(g => hashSet.Add(g.FullName));

                MethodReference definition = null;
                var             list       = new List <MethodReference>();

                list.AddRange(bfType.GetTypeDefinition().Methods);

                foreach (var reference in list)
                {
                    var methodDefinition = (MethodDefinition)reference;

                    if (methodDefinition.Name == methodReference.Name && methodDefinition.Parameters.Count == methodReference.Parameters.Count)
                    {
                        var flag = true;

                        for (var index = 0; index < methodDefinition.Parameters.Count; ++index)
                        {
                            var parameterDefinition = methodDefinition.Parameters[index];
                            var parameterReference  = methodReference.Parameters[index];

                            if (hashSet.Contains(BfCache.GetTypeReference(parameterDefinition.ParameterType).FullName))
                            {
                                if (!parameterReference.ToString().StartsWith("A_"))
                                {
                                    flag = false;
                                }
                            }
                            else if (Regex.Replace(parameterReference.ParameterType.FullName, "<[^>]*>", "") != Regex.Replace(parameterDefinition.ParameterType.FullName, "<[^>]*>", ""))
                            {
                                flag = false;
                            }
                        }

                        if (flag)
                        {
                            definition = methodDefinition;
                        }
                    }
                }

                if (definition == null)
                {
                }
                else
                {
                    GetSignature(definition); // ???
                    bfMethod = _cache.GetBfMethod(definition);
                }
            }
            return(bfMethod);
        }
示例#2
0
        internal BfMethod GetBfMethod(MethodReference methodReference)
        {
            BfMethod bfMethod = null;

            var bfAssembly = GetAssembly(methodReference, methodReference.DeclaringType.Scope as AssemblyNameReference);

            if (bfAssembly != null)
            {
                var      key = BfMethod.GetSignature(methodReference);
                BfMethod method;
                bfAssembly.GetMethodsDictionary().TryGetValue(key, out method);

                if (method == null)
                {
                    var type = GetBfType(methodReference.DeclaringType);
                    var list = new List <MethodDefinition>();

                    if (type != null)
                    {
                        list.AddRange(type.GetTypeDefinition().Methods);

                        var methodDef = list.FirstOrDefault(m => key == BfMethod.GetSignature(m));

                        if (methodDef != null)
                        {
                            method = new BfMethod(this, methodDef, type);
                            Methods.Add(method);
                            type.Methods.Add(method);
                            bfAssembly.GetMethodsDictionary().Add(method.UniqueName, method);
                        }
                    }
                }

                bfMethod = method;
            }

            return(bfMethod);
        }
示例#3
0
        internal void Populate()
        {
            if (IsInCoreAssembly)
            {
                BaseType = _bfCache.GetBfType(_typeDefinition.BaseType);

                if (BaseType != null && BaseType.FullName != "System.Object")
                {
                    BaseType.DerivedTypes.Add(this);
                }

                _typeDefinition.Interfaces.Select(t => _bfCache.GetBfType(t))
                .Where(t => t != null)
                .ForEach(t =>
                {
                    Interfaces.Add(t);
                    t.DerivedTypes.Add(this);
                });

                _typeDefinition.Fields.ForEach(f => Fields.Add(new BfField(_bfCache, f, this)));

                _typeDefinition.Methods.ForEach(m =>
                {
                    var bfMethod = new BfMethod(_bfCache, m, this);
                    Methods.Add(bfMethod);
                    Assembly.GetMethodsDictionary().Add(bfMethod.UniqueName, bfMethod);
                });

                _typeDefinition.Events.ForEach(e => Events.Add(new BfEvent(_bfCache, e, this)));

                Interfaces.Clear();
                Fields.Clear();
                Methods.Clear();
                Events.Clear();
            }
        }