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;
}