/// <summary> /// Get the backing fields for the <paramref name="property"/> these are different for readonly dependency properties where the setter returns the DependencyPropertyKey field. /// This method looks for fields that matches the name NameProperty and NamePropertyKey. /// </summary> private static bool TryGetBackingFieldsByName(IPropertySymbol property, Compilation compilation, out BackingFieldOrProperty getter, out BackingFieldOrProperty setter) { getter = default; setter = default; if (property == null || !property.ContainingType.IsAssignableTo(KnownSymbols.DependencyObject, compilation)) { return(false); } foreach (var member in property.ContainingType.GetMembers()) { if (BackingFieldOrProperty.TryCreateForDependencyProperty(member, out var candidate)) { if (candidate.Name.IsParts(property.Name, "Property")) { if (!DependencyProperty.IsPotentialDependencyPropertyBackingField(candidate)) { return(false); } getter = candidate; } if (candidate.Name.IsParts(property.Name, "PropertyKey")) { if (!DependencyProperty.IsPotentialDependencyPropertyKeyBackingField(candidate)) { return(false); } setter = candidate; } } } if (setter.Symbol == null) { setter = getter; } return(setter.Symbol != null); }