Otomatik Olarak Inotifypropertychanged
Otomatik olarak yazmak zorunda olmayan bir sınıf her ayarlayıcı içinde OnPropertyChanged özellik değişiklikler hakkında bilgi almak için herhangi bir yolu var mı? (Eğer bir değişiklik var mı öğrenmek istiyorum bu özellikleri yüzlerce var).
< / ^ hr .
Anton dynamic proxies öneriyor. Ben ... aslında kullanılan "Kale" kütüphane için benzer bir şey, geçmişte ve şu anda yaptığı miktarını azaltmak kodu aldım yazmak ekledi yaklaşık 30 saniye için benim program başlatma süresi (ymmv) - çünkü bu bir çalışma zamanı çözümü.
Eğer zaman çözümü derleme, belki derleme zamanı kullanarak öznitelikleri olup olmadığını merak ettim
< / ^ hr .
Slashene ve TcKs ver öneriler oluşturuyor tekrarlayan kod - ne yazık ki, tüm özellikleri basit bir davanın m_Value = değer - birkaç tane özel kod belirleyiciler, çok kolaycı kod parçacıkları ve xml değil gerçekten mümkün projem ya.
CEVAP
Aşağıdaki kod, (http://www.ingebrigtsen.info/post/2008/12/11/INotifyPropertyChanged-revisited.aspx) kullanıyoruz. Harika çalışıyor :)
public static class NotificationExtensions
{
#region Delegates
/// <summary>
/// A property changed handler without the property name.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sender">The object that raised the event.</param>
public delegate void PropertyChangedHandler<TSender>(TSender sender);
#endregion
/// <summary>
/// Notifies listeners about a change.
/// </summary>
/// <param name="EventHandler">The event to raise.</param>
/// <param name="Property">The property that changed.</param>
public static void Notify(this PropertyChangedEventHandler EventHandler, Expression<Func<object>> Property)
{
// Check for null
if (EventHandler == null)
return;
// Get property name
var lambda = Property as LambdaExpression;
MemberExpression memberExpression;
if (lambda.Body is UnaryExpression)
{
var unaryExpression = lambda.Body as UnaryExpression;
memberExpression = unaryExpression.Operand as MemberExpression;
}
else
{
memberExpression = lambda.Body as MemberExpression;
}
ConstantExpression constantExpression;
if (memberExpression.Expression is UnaryExpression)
{
var unaryExpression = memberExpression.Expression as UnaryExpression;
constantExpression = unaryExpression.Operand as ConstantExpression;
}
else
{
constantExpression = memberExpression.Expression as ConstantExpression;
}
var propertyInfo = memberExpression.Member as PropertyInfo;
// Invoke event
foreach (Delegate del in EventHandler.GetInvocationList())
{
del.DynamicInvoke(new[]
{
constantExpression.Value, new PropertyChangedEventArgs(propertyInfo.Name)
});
}
}
/// <summary>
/// Subscribe to changes in an object implementing INotifiyPropertyChanged.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ObjectThatNotifies">The object you are interested in.</param>
/// <param name="Property">The property you are interested in.</param>
/// <param name="Handler">The delegate that will handle the event.</param>
public static void SubscribeToChange<T>(this T ObjectThatNotifies, Expression<Func<object>> Property, PropertyChangedHandler<T> Handler) where T : INotifyPropertyChanged
{
// Add a new PropertyChangedEventHandler
ObjectThatNotifies.PropertyChanged = (s, e) =>
{
// Get name of Property
var lambda = Property as LambdaExpression;
MemberExpression memberExpression;
if (lambda.Body is UnaryExpression)
{
var unaryExpression = lambda.Body as UnaryExpression;
memberExpression = unaryExpression.Operand as MemberExpression;
}
else
{
memberExpression = lambda.Body as MemberExpression;
}
var propertyInfo = memberExpression.Member as PropertyInfo;
// Notify handler if PropertyName is the one we were interested in
if (e.PropertyName.Equals(propertyInfo.Name))
{
Handler(ObjectThatNotifies);
}
};
}
}
Örneğin bu şekilde kullanılır:
public class Employee : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _firstName;
public string FirstName
{
get { return this._firstName; }
set
{
this._firstName = value;
this.PropertyChanged.Notify(()=>this.FirstName);
}
}
}
private void firstName_PropertyChanged(Employee sender)
{
Console.WriteLine(sender.FirstName);
}
employee = new Employee();
employee.SubscribeToChange(() => employee.FirstName, firstName_PropertyChanged);
Örneğin bazı sözdizimi hataları olabilir. Test etmedi. Ama bu kavram en azından olmalı :)
DÜZENLEME:Daha az çalışmak istersin diye, ama şimdi görüyorum... bu işlerden en azından çok daha kolay hale getirir. Ve özellikleri dizeleri kullanarak atıfta ile korkunç sorunları önlemek.
Ve Heroku raylar 3: otomatik olarak &;...
Dış div yüzen içeriği otomatik olarak ...
Nasıl otomatik olarak bir sayfayı yeni...
Otomatik olarak Sayfanın en Altına gid...
Vasiyet otomatik olarak günlük şifre d...