Автоматически INotifyPropertyChanged

Просто поместите параметры в словарь и установите кодировку в методе запроса alamofire в JsonEncoding.default

57
задан user990423 27 August 2015 в 19:52
поделиться

5 ответов

nameof оператор был реализован в C# 6.0 с.NET 4.6 и VS2015 в июле 2015. Следующее все еще допустимо для C# < 6.0

Мы используем код ниже (От http://www.ingebrigtsen.info/post/2008/12/11/INotifyPropertyChanged-revisited.aspx ). Работает отлично :)

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);
                }
            };
    }
}

Используемый, например, этот путь:

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);

Некоторые синтаксические ошибки в примере могут существовать. Не протестировал его. Но у Вас должно быть понятие там, по крайней мере, :)

РЕДАКТИРОВАНИЕ: я вижу теперь, когда Вы, возможно, хотели еще меньше работы, но да... материал выше, по крайней мере, делает ее намного легче. И Вы предотвращаете все страшные проблемы с обращением к свойствам с помощью строк.

39
ответ дан Ian Ringrose 24 November 2019 в 19:23
поделиться

Реализуйте безопасное с точки зрения типов INotifyPropertyChanged: Видят здесь

, Затем делают Ваш собственный фрагмент кода:

private $Type$ _$PropertyName$;
public $Type$ $PropertyName$
{
    get
    {
        return _$PropertyName$;
    }
    set
    {
        if(value != _$PropertyName$)
        {
            _$PropertyName$ = value;
            OnPropertyChanged(o => o.$PropertyName$);               
        }
    }
}

С разработчик Фрагмента кода и Вы сделали! Легкий, безопасный способ создать Ваш INotifyPropertyChanged.

10
ответ дан Vahid Farahmandian 24 November 2019 в 19:23
поделиться

Вы смотрите, мог Рокироваться или Spring.NET и функциональность перехватчика реализации?

2
ответ дан Neil Barnwell 24 November 2019 в 19:23
поделиться

Я не знаю стандартного пути, но я знаю два обходных решения:

1) PostSharp может сделать это для Вас после компиляции. Это очень полезно, но это занимает время на каждой сборке.

2) Инструмент пользователя i Visual Studio. Можно объединить его с "частичным классом". Затем можно создать инструмент пользователя для XML, и можно генерировать исходный код от xml.

, Например, этот xml:

<type scope="public" type="class" name="MyClass">
    <property scope="public" type="string" modifier="virtual" name="Text" notify="true" />
</type>

может быть источник для этого кода:

public partial class MyClass {
    private string _text;
    public virtual string Text {
        get { return this._Text; }
        set {
            this.OnPropertyChanging( "Text" );
            this._Text = value;
            this.OnPropertyChanged( "Text" );
        }
    }
}
4
ответ дан TcKs 24 November 2019 в 19:23
поделиться

вы можете изучить аспектно-ориентированное программирование в целом

Frameworks => вы можете посмотреть linfu

4
ответ дан 24 November 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: