2010-02-05 5 views
2

Y at-il un moyen d'autogénérer le constructeur 2-param évident pour cette classe dans Visual Studio?Constructeurs autogénérés qui initialisent simplement les champs aux paramètres passés?

class Thing { 
    public readonly string a; 
    public readonly Object b; 
} 

Je suppose que vous êtes censé utiliser:

new Thing { a = ..., b = ... } 

syntaxe dans de tels cas, mais cela ne fonctionnera pas avec les champs comme ci-dessus en lecture seule. Un autre avantage d'avoir un constructeur est que vous ne pouvez pas oublier un champ.

Répondre

4

Il y a, Resharper cette fonctionnalité. Vous choisissez le "Générateur de Génération", choisissez les champs que vous voulez inclure et vous avez votre constructeur.

+0

Choisissez cette réponse parce que c'est ce que j'ai fini par faire, bien que les autres suggestions soient bonnes aussi :) – FunctorSalad

2

Vous pouvez consulter les modèles T4. Il serait assez simple d'écrire un modèle qui répète une liste des noms et types de propriétés en lecture seule et crée le code nécessaire pour les propriétés et le constructeur.

Les modèles T4 sont intégrés à Visual Studio. Consultez le blog de Scott Hanselman sur les modèles T4 pour plus de détails.

Il existe d'autres produits qui peuvent automatiser ce type de refactoring. Resharper est l'un d'entre eux, mais ce n'est pas gratuit.

3

Désolé pour un poste qui n'est pas utile du tout, mais je n'ai pas pu résister.

Je crains que les choses en utilisant comme modèles T4, vous (probablement) perdre IntelliSense, qui peut ne pas être un prix que vous vouliez payer. Vous pourriez probablement écrire une macro VS.NET pour générer automatiquement le code du constructeur (je crois que le modèle de code devrait vous donner assez d'informations pour le faire).

Maintenant, voici la partie inutile du poste - vous pourriez peut-être essayer un autre langage .NET si vous êtes fâché avec la verbosité unnecesary de C#. En F #, vous pouvez écrire des constructeurs implicites et leurs paramètres deviennent automatiquement (en lecture seule) champs:

type Thing(a:string, b:Object) = 
    // members can use 'a' and 'b' directly - here is one example: 
    member this.GetInfo() = 
    "Some info: " + a + (b.ToString()) 

Dans un scénario réel, vous avez probablement pas besoin de spécifier les types, parce que F # peut les déduire automatiquement en fonction sur l'utilisation ultérieure. Expérimenter avec F # n'est pas aussi difficile si vous êtes déjà familier avec les bibliothèques .NET.

+0

+1 commentaire perspicace –

+0

Désolé pour le Mur de Texte ici; en quelque sorte, les paragraphes sont ignorés ici. Vous avez frappé le clou sur la tête, j'aime la programmation fonctionnelle;) Haskell m'a donné l'habitude de faire à peu près tout ce qui n'est pas critique en lecture seule. N'a pas regardé F # encore, mais peut-être que je devrais savoir si F # serait acceptable pour les gens que je suis codant pour (je suppose que le souci serait le même que celui avec Haskell, mais peut-être moins sévère: Ce qu'ils ne trouvera pas d'autres programmeurs qui le parlent). C# n'est pas si mal FP-sage, mais il me manque des types somme. – FunctorSalad

+0

il existe divers produits gratuits qui fournissent intellisense pour T4. par exemple. Éditeur T4 de Tangible Engineering –

Questions connexes