SORU
9 ŞUBAT 2009, PAZARTESİ


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
9 ŞUBAT 2009, PAZARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ABC News (Australia)

    ABC News (Au

    9 HAZİRAN 2008
  • Charles Griffin Gibson

    Charles Grif

    26 NİSAN 2006
  • The Brister

    The Brister

    10 ŞUBAT 2008