Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- internal static class Extensions
- {
- private static readonly ConcurrentDictionary<Type, Func<INotifyPropertyChanged, PropertyChangedEventHandler?>> EventGetters =
- new();
- public static bool Raise<T>(this INotifyPropertyChanged self, ref T field, T value,
- [CallerMemberName] string? propertyName = "")
- {
- if (string.IsNullOrEmpty(propertyName))
- throw new ArgumentException("atata");
- if (EqualityComparer<T>.Default.Equals(field, value)) return false;
- field = value;
- var type = self.GetType();
- if(!EventGetters.TryGetValue(type, out var getter))
- {
- var parameterExpr = Expression.Parameter(typeof(INotifyPropertyChanged));
- var instanceExpr = Expression.Convert(parameterExpr, type);
- var body = Expression.Field(instanceExpr, nameof(self.PropertyChanged));
- getter = Expression
- .Lambda<Func<INotifyPropertyChanged, PropertyChangedEventHandler?>>(body, parameterExpr).Compile();
- EventGetters[type] = getter;
- }
- var eventDelegate = getter(self);
- eventDelegate?.Invoke(self, new PropertyChangedEventArgs(propertyName));
- return true;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement