2009-08-15 8 views
0

J'ai un ensemble de propriétés et j'ai besoin de leur fournir une valeur par défaut. Bien sûr, je peux faire ce qui suit dans getter:Comment définir la valeur par défaut pour une propriété avec attribut?

public string MyProp  { 
     get { 
       if(!string.IsNulOrEmpty(_myProp)) 
        return _myProp; 
       else 
        return "Default"; 
      } 

Mais comme à `d ressembler

[DefaultValue("Default")] 
public string Processes 
{ 
    get { return _processes; } 

Y at-il une bonne façon de le faire avec des attributs? J'ai passé du temps à chercher un attribut ou un moyen de le faire mais je n'ai rien trouvé.

Répondre

2

Je ferais:

private string processes = "default"; 

public string Processes 
{ 
    ... 
} 
+0

Oui, absolument d'accord avec vous et c'est ma solution, mais cela ne peut pas être fait lors de la mise en œuvre des autoproperties. Et si nous avons un attribut, cela pourrait être fait d'une manière très cool, en marquant simplement la propriété avec un attribut qui a une valeur par défaut. –

+0

@Yaroslav Yakovlev: Vous avez raison, les propriétés automatiques ne vous permettent pas du tout d'interagir avec le champ de sauvegarde. C'est l'un des inconvénients pour eux. –

+0

C'est difficile avec un attribut, car vous devez également impliquer le type. –

0

Vous ne pouvez pas le faire avec des attributs sauf si vous utilisez une sorte de post-processeur comme PostSharp. DefaultValueAttribute est utilisé pour informer PropertyGrid (ou d'autres contrôles de type navigateur de propriétés) de la valeur par défaut de la propriété afin qu'ils puissent indiquer quand elle a été modifiée par rapport à cette valeur par défaut et la réinitialiser à cette valeur par défaut.

Ce que vous devez faire est quelque chose comme ceci:

private const string _processDefault = "Default"; 
private string _processDefault = _processDefault Default; 
public string Process 
{ 
    get 
    { 
     return _processDefault ; 
    } 
    set 
    { 
     if (String.IsNullOrEmpty(value)) 
     { 
      value = _processDefault ; 
     } 

     _myProp = value; 
    } 
} 

Si vous ne voulez pas la valeur à régler hors de votre contrôle font le poseur privé. En utilisant cette approche, vous pouvez toujours utiliser l'attribut, mais vous devrez écrire un code de réflexion pour obtenir sa valeur et vous devrez initialiser la variable privée _myProp via un appel de fonction plutôt qu'en ligne comme je l'ai montré.

+0

Merci pour votre réponse. Mais en réalité, il n'est pas sur le point d'utiliser des attributs. Il s'agit de réduire la quantité de code écrit et le principe sec. Je ne veux pas répéter dans toutes mes propriétés si elle est vide - retourner la valeur par défaut, sinon - retourner sa valeur. Je veux qu'il soit court et descriptif comme marquer avec l'attribut qui maintiendra la valeur par défaut. –

+0

La seule façon d'accomplir quelque chose de ce genre est d'utiliser un outil de post-traitement comme PostSharp. La chose à garder à l'esprit est que * idéalement * les acquéreurs de propriété devraient être "sans effets secondaires" que cela violerait. Les getters de propriété sont exécutés dans beaucoup d'endroits (y compris les fenêtres de surveillance/surveillance rapide lors du débogage) et les effets secondaires peuvent mener à des expériences étranges. –

Questions connexes