К методу, который выполняет какое-либо время свойство класса, получают доступ (получите или установите)?

"Связанный подзапрос" (т.е. тот, в который, где условие зависит от значений, полученных из строк содержания запроса) выполнится однажды для каждой строки. Несвязанный подзапрос (тот, в который, где условие независимо от содержания запроса) выполнится однажды вначале. Механизм SQL делает это различие автоматически.

, Но, да, объяснять-план предоставит Вам грязную подробную информацию.

5
задан Jeff 5 December 2009 в 22:45
поделиться

2 ответа

Вы не можете сделать это автоматически, но вы можете получить 95% бесплатно. Это классический случай аспектно-ориентированного программирования . Посмотрите PostSharp , в котором есть класс OnFieldAccessAspect . Вот как вы можете решить вашу проблему:

[Serializable]
public class FieldLogger : OnFieldAccessAspect {
    public override void OnGetValue(FieldAccessEventArgs eventArgs) {
        Console.WriteLine(eventArgs.InstanceTag);
        Console.WriteLine("got value!");
        base.OnGetValue(eventArgs);
    }

    public override void OnSetValue(FieldAccessEventArgs eventArgs) {
        int i = (int?)eventArgs.InstanceTag ?? 0;
        eventArgs.InstanceTag = i + 1;
        Console.WriteLine("value set!");
        base.OnSetValue(eventArgs);
    }

    public override InstanceTagRequest GetInstanceTagRequest() {
        return new InstanceTagRequest("logger", new Guid("4f8a4963-82bf-4d32-8775-42cc3cd119bd"), false);
    }
}

Теперь все, что наследуется от FieldLogger, будет вести себя так же. Presto!

4
ответ дан 14 December 2019 в 13:38
поделиться

Я не верю, что это возможно сделать декларативно, я никогда не видел, чтобы это делалось таким образом. Что вы можете сделать, так это реализовать интерфейс INotifyPropertyChanged в своем базовом классе и иметь реализацию интерфейса в базовом классе. Примерно так:

public class A : INotifyPropertyChanged
{

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    protected virtual void RaiseOnPropertyChanged(object sender, string propertyName)
    {
        if (this.PropertyChanged != null)
            PropertyChanged(sender, new PropertyChangedEventArgs(propertyName);
    }

    public A()
    {
        this.PropertyChanged += new PropertyChangedEventHandler(A_PropertyChanged);
    }

    void A_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        //centralised code here that deals with the changed property
    }
}


public class B : A
{
    public string MyProperty
    {
        get { return _myProperty; }
        set 
        {
            _myProperty = value;
            RaiseOnPropertyChanged(this, "MyProperty");
        }
    }

    public string _myProperty = null;
}
2
ответ дан 14 December 2019 в 13:38
поделиться
Другие вопросы по тегам:

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