Два вопроса о свойствах в C # - PullRequest
3 голосов
/ 16 февраля 2011

У меня есть два простых вопроса, основанных на том факте, что я расширяю существующий класс ...

1) Я реализую некоторые пользовательские свойства, и мне бы хотелось, чтобы всякий раз, когда их значения менялись, вызывалась конкретная (без параметров) функция. Конечно, если бы не было необходимости вызывать функцию, я мог бы использовать традиционный синтаксис { get; set; } без необходимости в дополнительной переменной. Однако, и даже если единственное, что я изменяю в методе доступа set, - это вызов другой функции, я должен объявить приватную переменную, чтобы я мог сам указать методы доступа get и set ... Isn ' Есть ли более простой способ сделать это, не объявляя так много переменных? Не существует ли что-то вроде gerenal события «изменение свойства»?

2) Поскольку я переопределяю пользовательский элемент управления .NET, я хотел бы изменить категорию, в которой отображаются некоторые базовые свойства. В настоящий момент, и просто для использования синтаксиса [Category("")], я должен объявить эти свойства как new и реализовать get и set, ссылаясь на свойства базового класса. Разве нет простого способа сделать это?

Ответы [ 5 ]

1 голос
/ 25 февраля 2011

C # изначально не поддерживает это, но вы можете перейти на AOP через Перехватчики в Windsor , что даст вам хит во время выполнения или использовать что-то вроде PostSharp для генерации кода для вызовов событий. PostSharp внедрит код IL после создания сборок, поэтому он не должен давать такой же большой удар, как производительность Windsor во время выполнения.

Хорошей идеей будет также прочитать немного больше о AOP .

1 голос
/ 19 февраля 2011

Может быть, вам стоит заглянуть в интерфейс INotifyPropertyChanged .Ниже приведен пример кода, который его использует.Я использую этот интерфейс для выполнения привязки данных в WPF.Вы можете обработать событие, обнаружить свойство, которое изменилось, и действовать соответственно.Вы даже можете вызвать событие в другом потоке (PropertyChanged.BeginInvoke ()), если хотите, чтобы установщик был асинхронным ...

using System;
using System.ComponentModel;

public class Foo : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
            RaisePropertyChanged("Name");
        }
    }
}
0 голосов
/ 02 марта 2011

Может быть, я здесь, но как насчет этого для # 1:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EraseMe2
{
class Program
{
    static void Main(string[] args)
    {
        Test t = new Test();
        t.MyProperty = 100;
        t.MyProperty = 500;
    }
}


class Test
{
    public int set(ref int prop, int val)
    {
        prop = val;
        Console.WriteLine(String.Format("{0} changed to {1}", prop.GetType().Name, val.ToString()));
        return val;
    }

    private int _myProperty;
    public int MyProperty
    {
        get { return _myProperty; }
        set
        {
            _myProperty = set(ref _myProperty, value);
        }
    }
}

}
0 голосов
/ 16 февраля 2011

1) Нет, событие изменения свойства отсутствует. Если вы настаиваете на том, чтобы не создавать дополнительные переменные , вы можете пойти по маршруту AOP . Вы должны быть удовлетворены без AOP, если не существует бесчисленных свойств, с которыми вы имеете дело, и в этом случае вы можете выбрать генерацию кода (возможно, написать скрипт python / ruby ​​для генерации кода или использовать общий генератор кода)

2) Я не думаю, что вы можете изменить свойства до выполнения (в Visual Studio) без генерации кода.

0 голосов
/ 16 февраля 2011

Если вы пытаетесь захватить события из свойств, к которым обращаются без большого количества дублирующегося кодирования, сохраняя разделение проблем, вы можете изучить методы аспектно-ориентированного программирования, используя такие инфраструктуры, как Castle , но остерегайтесь того, чтоэто сложная тема, которая включает трудный выбор архитектуры вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...