Ejemplo n.º 1
0
        private AnalysisNet.Types.IMethodReference ExtractNonGenericInstanceMethod(Cecil.MethodReference methodref)
        {
            AnalysisNet.Types.IType      extractedType = ExtractType(methodref.DeclaringType);
            AnalysisNet.Types.IBasicType containingType;
            if (extractedType is AnalysisNet.Types.ArrayType arrayType)
            {
                containingType = new FakeArrayType(arrayType);
            }
            else
            {
                containingType = (AnalysisNet.Types.IBasicType)extractedType;
            }

            AnalysisNet.Types.MethodReference method = new AnalysisNet.Types.MethodReference(methodref.Name, AnalysisNet.Types.PlatformType.Void);
            genericParameterExtractor.MapGenericParameters(methodref, method);
            method.ReturnType = ExtractType(methodref.ReturnType);

            ExtractParameters(method.Parameters, methodref.Parameters);

            method.GenericParameterCount = methodref.GenericParameters.Count();
            method.ContainingType        = containingType;
            method.IsStatic = !(methodref.HasThis || methodref.ExplicitThis);

            method.Resolve(host);
            return(method);
        }
Ejemplo n.º 2
0
        public AnalysisNet.Types.IMethodReference ExtractMethod(Cecil.MethodReference methodReference)
        {
            return(performanceCache.GetOrCreate(methodReference, (cacheEntry) =>
            {
                if (methodReference is Cecil.GenericInstanceMethod instanceMethod)
                {
                    List <AnalysisNet.Types.IType> genericArguments = new List <AnalysisNet.Types.IType>();

                    foreach (Cecil.TypeReference typeParameterref in instanceMethod.GenericArguments)
                    {
                        AnalysisNet.Types.IType typeArgumentref = ExtractType(typeParameterref);
                        genericArguments.Add(typeArgumentref);
                    }

                    AnalysisNet.Types.IMethodReference method = ExtractMethod(instanceMethod.GetElementMethod());
                    AnalysisNet.Types.MethodReference instantiatedMethod = AnalysisNet.Extensions.Instantiate(method, genericArguments);
                    instantiatedMethod.Resolve(host);

                    return instantiatedMethod;
                }
                else
                {
                    return ExtractNonGenericInstanceMethod(methodReference);
                }
            }));
        }