12
votes

Convertir la propriété automobile en propriété complète

J'ai souvent besoin de convertir des propriétés automatiques en propriétés complètes avec un champ de support afin que je puisse mettre en œuvre inotifypropertychanged code>. Il devient très fastidieux lorsqu'une classe a 50 propriétés plus de 50 propriétés. XXX PRE>

à P>

private string _myProperty;
public string MyProperty
{
    get
    {
        return _myProperty;
    }
    set
    {
        _myProperty = value;
        OnPropertyChanged("MyProperty");
    }
}


3 commentaires

Eh bien alt + Entrée n'a rien fait parce que je n'ai pas permis de raccourcis et que je ne pouvais rien trouver d'utile dans les menus. Quoi qu'il en soit, cette solution aurait seulement duré 30 jours.


Resharber est assez inutile sans raccourcis activé. Donnez-lui une chance la prochaine fois.


Vous pouvez utiliser une belle extension simple appelée Propman, très rapide et fonctionne à la fois des idées, Marketplace.Visualstudio .com / articles? itemName = olegshilo.propma n


4 Réponses :


12
votes

Si vous avez Notepad ++, vous pouvez le faire via regex (assez laid, mais fonctionne)

Trouver quoi: (public) \ s + ([A-ZA-Z0-9] +) \ S + ([A-ZA-Z0-9] +) \ s * \ {\ s * + obtenir ; \ s * set; \ s * \}

Remplacer par: privé \ 2 _ \ 3 \; \ r \ n \ 1 \ 2 \ 3 \ r \ n \ {\ r \ n get \ {retour _ \ 3 \; \} \ r \ n set \ {_ \ 3 = valeur \; Onpropertychangned \ (\ "\ 3 \" \) \; \} \ r \ n \}

Assurez-vous que "l'expression régulière" est vérifiée

C'est ce que l'écran de recherche / remplacement ressemble à: Findreplaceimg

et ça va de

startimg

à:

endimg

Edit: Merci à Britton, voici l'équivalent Visual Studio:

Rechercher: public [^ \ s \ r \ n] (. +) [^ \ s \ r \ n] (\ B (_ \ w + | [\ w- [0-9 _]] \ w *) \ b) [^ \ s \ r \ n] {[^ \ s \ r \ n] get; [^ \ s \ r \ n] ensemble; [^ \ s \ r \ n]}

Remplacer: privé 1 $ _ $ 2; \ r \ npublic $ 1 $ 2 {\ r \ nget \ n {\ r \ nreturn _ $ 2; \ r \ n} \ r \ nset \ r \ n { \ r \ n_ $ 2 = valeur; Onpropertychanged ("$ 2"); \ r \ n} \ r \ n}


5 commentaires

Peut-être que la même regex fonctionne également avec la recherche / remplacement de Visual Studio? La syntaxe peut être légèrement différente, mais elle devrait fonctionner.


Pas le plus pratique mais ça marche. Je l'accepterai comme la réponse si personne ne propose de mieux. J'ai été capable de convertir au moins la regex pour Visual Studio. Trouver: public [^ \ s \ r \ n] (. +) [^ \ S \ r \ n] (\ B (_ \ w + | [\ w- [0-9 _]] \ w *) \ b) [^ \ s \ r \ n] {[^ \ s \ r \ n] get; [^ \ s \ r \ n] ensemble; [^ \ s \ r \ n] } remplacer: privé 1 $ _ $ 2; \ r \ npublic $ 1 $ 2 {\ r \ nget \ n _ \ nreturn _ $ 2; \ r \ n} \ r \ nset \ r \ n {\ r \ n_ $ 2 = valeur; Onpropertychangned ("$ 2"); \ r \ n} \ r \ n}


La regex de Dan trouve et remplace ne ramassera pas les propriétés avec des génériques dans le type, par exemple IList public <événement> événements {obtenir; ensemble; } ou des types de valeur nullables, par exemple Public int? ... . Les crochets d'angle et le point d'interrogation jettent-le. Une modification mineure fixe que: (public) \ s + ([A-ZA-Z0-9 <> \?] +) \ S + ([A-ZA-Z0-9] +) \ s * \ {\ \ \ s * + get; \ s * set; \ s * \} . (Le seul changement est l'ajout des crochets d'angle et de la marque d'interrogation, de (public) \ s + ([A-ZA-Z0-9] +) \ S + ... à ( Public) \ s + ([A-ZA-Z0-9 <> \?] +) \ s + ... .)


Un autre changement, pour gérer les crochets, par exemple octet public [] ... . Maintenant, la première regex devient: (public) \ s + ([A-ZA-Z0-9 <> \ [\] \?] +) \ S + ([A-ZA-Z0-9] +) * \ {\ s * + g et; \ s * set; \ s * \} . Le seul changement de Dan's Regex est l'ajout du <> \ [\] \? .


Cher Seigneur à cette réponse ... accessoires!



2
votes

Malheureusement, il semble que ces types de petits extraits de refactoring personnalisés ne soient pas pris en charge dans Visual Studio. Regarder à travers la documentation que j'ai trouvée Ceci A>:

surroundswith: permet à l'extrait de code d'être placé autour d'une sélection sélectionnée. morceau de code. p>

Expansion: permet d'insérer l'extrait de code au curseur. P>

refactoring: spécifie que l'extrait de code est utilisé lors du visuel C # refactoring. refactoring ne peut pas être utilisé dans les extraits de code personnalisés. strong> p> blockQquote>

Je suis également allé de l'avant et j'ai créé un extrait pour créer une propriété complète à partir de zéro, mais ce n'est que pour de nouvelles propriétés, pas des propriétés existantes. P>

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets
  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>fprop</Title>
      <Shortcut>fprop</Shortcut>
      <Description>Full Property with Backing Store</Description>
      <Author>Nathan McGinn</Author>
      <SnippetTypes>
        <SnippetType>Refactoring</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>type</ID>
          <Default>string</Default>
          <ToolTip>The type of your property</ToolTip>
        </Literal>
        <Literal>
          <ID>back</ID>
          <Default>_myProperty</Default>
          <ToolTip>The name of your backing variable</ToolTip>
        </Literal>
        <Literal>
          <ID>prop</ID>
          <Default>MyProperty</Default>
          <ToolTip>Your public property's name</ToolTip>
        </Literal>
      </Declarations>
      <Code Language="CSharp">
        <![CDATA[private $type$ $back$;
        public $type$ $prop$
        {
          get
          {
            return this.$back$;
          }
          set
          {
            this.$back$ = value;
            OnPropertyChanged("$prop$");
          }
        }]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>


0 commentaires

1
votes

J'ai testé ce code avec le class1 code> seulement. Mais cela vous donnera le point de départ. Je n'ai pas utilisé de nommage de fantaisie pour les variables. Veuillez modifier les noms de variables selon les besoins. Il mettra le privé ... code> devant les propriétés et ignorez les méthodes.

public class Program
{

    public static void Main(string[] args)
    {

        Class1 c = new Class1();
        Type testType = c.GetType();
        PropertyInfo[] prinfo = testType.GetProperties();
        string[] filetest=File.ReadAllLines("Class1.cs"); //put correct file path here
        int index=0,i=0;            
        foreach (PropertyInfo p in prinfo)
        {                
            while(i < filetest.Length )
            {
                index = filetest[i].IndexOf(p.Name);
                if (index > 0)
                {
                    index = 0;
                    filetest[i]=filetest[i].Insert(0, "private " + p.PropertyType.ToString() + " _" + p.Name+";" + Environment.NewLine);
                }
                i++;
            }                  

        }
        File.WriteAllLines("Class1.cs", filetest);//put correct file path here
        Console.Read();
    }        
}


0 commentaires

3
votes

J'ai fini par utiliser Dan's Regex pour la conversion de nombreuses propriétés à la fois. J'ai également trouvé une extension de studio visuelle appelée Propman c'est bon pour convertir une seule propriété à la fois. Il suffit de mettre le curseur sur la propriété puis appuyez sur ctrl + \, ctrl + \ pour convertir entre auto / complet.


0 commentaires