Pergunta

Gostaria de saber se existe alguma maneira de adicionar comportamentos personalizados aos métodos Auto Property Get/Set.

Um caso óbvio em que posso pensar é querer que todos os métodos de propriedades sejam PropertyChanged manipuladores de eventos como parte de um System.ComponentModel.INotifyPropertyChanged implementação. Isso permitiria que uma classe tivesse inúmeras propriedades que possam ser observadas, onde cada propriedade é definida usando a sintaxe da propriedade automática.

Basicamente, estou me perguntando se há algo semelhante a um modelo GET/Set ou Post Get/Set Hook com o escopo da classe.

(Eu sei que a mesma funcionalidade final pode ser facilmente alcançada de maneiras um pouco mais detalhadas - eu apenas odeio a duplicação de um padrão)

Foi útil?

Solução

Não, você terá que usar definições de propriedades "tradicionais" para comportamento personalizado.

Outras dicas

Não, você não pode: a propriedade automática é um atalho para um acessador explícito para um campo privado. por exemplo

public string Name { get; set;} 

é um atalho para

private string _name;
public string Name { get { return _name; } set { _name = value; } };

Se você deseja colocar a lógica personalizada, deve escrever e definir explicitamente.

Olhar para PostSharp. É uma estrutura AOP para um problema típico "Este padrão de código que eu faço o tempo por dia, como posso automatizá -lo?". Você pode simplificar com o PostSharp isto (por exemplo):

public Class1 DoSomething( Class2 first, string text, decimal number ) {
    if ( null == first ) { throw new ArgumentNullException( "first" ); }
    if ( string.IsNullOrEmpty( text ) ) { throw new ArgumentException( "Must be not null and longer than 0.", "text" ) ; }
    if ( number < 15.7m || number > 76.57m ) { throw new OutOfRangeArgumentException( "Minimum is 15.7 and maximum 76.57.", "number"); }

    return new Class1( first.GetSomething( text ), number + text.Lenght );
}

para

    public Class1 DoSomething( [NotNull]Class2 first, [NotNullOrEmpty]string text, [InRange( 15.7, 76.57 )]decimal number ) {
        return new Class1( first.GetSomething( text ), number + text.Lenght );
}

Mas isto não é tudo! :)

Se for um comportamento que você repetirá muito durante o desenvolvimento, poderá criar um trecho de código personalizado para o seu tipo especial de propriedade.

Você poderia considerar usar PostSharp para escrever interceptores de setters. É LGPL e GPLED, dependendo de quais peças da biblioteca você usa.

A solução mais próxima que consigo pensar é usar um método auxiliar:

public void SetProperty<T>(string propertyName, ref T field, T value)
 { field = value;
   NotifyPropertyChanged(propertyName);
 }

public Foo MyProperty 
 { get { return _myProperty}
   set { SetProperty("MyProperty",ref _myProperty, value);}
 } Foo _myProperty;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top