Catel.Fody.CatelType.FindRegisterPropertyMethod C# (CSharp) Method

FindRegisterPropertyMethod() private method

private FindRegisterPropertyMethod ( Mono.Cecil.TypeDefinition typeDefinition, bool includeDefaultValue ) : MethodReference
typeDefinition Mono.Cecil.TypeDefinition
includeDefaultValue bool
return Mono.Cecil.MethodReference
        private MethodReference FindRegisterPropertyMethod(TypeDefinition typeDefinition, bool includeDefaultValue)
        {
            var typeDefinitions = new Stack<TypeDefinition>();
            MethodDefinition methodDefinition;
            var currentTypeDefinition = typeDefinition;

            do
            {
                typeDefinitions.Push(currentTypeDefinition);

                List<MethodDefinition> methods;

                if (includeDefaultValue)
                {
                    // Search for this method:         
                    // public static PropertyData RegisterProperty<TValue>(string name, Type type, TValue defaultValue, EventHandler<AdvancedPropertyChangedEventArgs> propertyChangedEventHandler = null, bool includeInSerialization = true, bool includeInBackup = true, bool setParent = true)
                    methods = (from method in currentTypeDefinition.Methods where method.Name == "RegisterProperty" && method.IsPublic && method.Parameters.Count == 7 && method.HasGenericParameters && method.GenericParameters.Count == 1 && method.Parameters[0].ParameterType.FullName.Contains("System.String") && !method.Parameters[2].ParameterType.FullName.Contains("System.Func") select method).ToList();
                }
                else
                {
                    // Search for this method:         
                    // public static PropertyData RegisterProperty(string name, Type type, object defaultValue, EventHandler<AdvancedPropertyChangedEventArgs> propertyChangedEventHandler = null, bool includeInSerialization = true, bool includeInBackup = true, bool setParent = true)
                    methods = (from method in currentTypeDefinition.Methods where method.Name == "RegisterProperty" && method.IsPublic && !method.HasGenericParameters && method.Parameters[0].ParameterType.FullName.Contains("System.String") select method).ToList();
                }

                if (methods.Count > 0)
                {
                    methodDefinition = methods.First();
                    break;
                }

                var baseType = currentTypeDefinition.BaseType;
                if (baseType == null || baseType.FullName == "System.Object")
                {
                    return null;
                }

                currentTypeDefinition = baseType.ResolveType();
            }
            while (true);

            return methodDefinition;
        }