Advertisement
Guest User

Untitled

a guest
May 5th, 2024
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.33 KB | None | 0 0
  1.     internal static class Extensions
  2.     {
  3.         private static readonly ConcurrentDictionary<Type, Func<INotifyPropertyChanged, PropertyChangedEventHandler?>> EventGetters =
  4.             new();
  5.  
  6.         public static bool Raise<T>(this INotifyPropertyChanged self, ref T field, T value,
  7.             [CallerMemberName] string? propertyName = "")
  8.         {
  9.             if (string.IsNullOrEmpty(propertyName))
  10.                 throw new ArgumentException("atata");
  11.  
  12.             if (EqualityComparer<T>.Default.Equals(field, value)) return false;
  13.             field = value;
  14.  
  15.             var type = self.GetType();
  16.             if(!EventGetters.TryGetValue(type, out var getter))
  17.             {
  18.                 var parameterExpr = Expression.Parameter(typeof(INotifyPropertyChanged));
  19.                 var instanceExpr = Expression.Convert(parameterExpr, type);
  20.                 var body = Expression.Field(instanceExpr, nameof(self.PropertyChanged));
  21.                 getter = Expression
  22.                     .Lambda<Func<INotifyPropertyChanged, PropertyChangedEventHandler?>>(body, parameterExpr).Compile();
  23.                 EventGetters[type] = getter;
  24.             }
  25.  
  26.             var eventDelegate = getter(self);
  27.             eventDelegate?.Invoke(self, new PropertyChangedEventArgs(propertyName));
  28.  
  29.             return true;
  30.         }
  31.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement