2014-04-29 11 views
9

मुझे अक्सर बैकिंग फ़ील्ड के साथ ऑटो गुणों को पूर्ण गुणों में परिवर्तित करने की आवश्यकता है ताकि मैं INotifyPropertyChanged लागू कर सकूं। जब कक्षा में 50+ गुण होते हैं तो यह बहुत कठिन हो जाता है।स्वत: संपत्ति को पूर्ण संपत्ति में कनवर्ट करें

public string MyProperty { get; set;} 

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

को मैं उपरोक्त प्रारूप में एक नया संपत्ति बनाता है एक कोड का टुकड़ा बनाने के लिए कर रहा था, लेकिन अगर यह एक मौजूदा संपत्ति के नाम पर खींचने के लिए संभव है मैं नहीं जानता और टाइप करें और इसे प्रतिस्थापित करें।

मैंने kindofmagic देखा लेकिन मैं वास्तव में अपने प्रोजेक्ट में आर्केन जादू का उपयोग नहीं करना चाहता।

This question बताता है कि रिशेर्पर में इसे कैसे किया जाए, लेकिन मेरे पास रिशेर्पर नहीं है। मैंने परीक्षण भी डाउनलोड किया और अभी भी यह नहीं पता कि यह कैसे किया जाए।

क्या कोड स्निपेट, मैक्रोज़ या यहां तक ​​कि एक निःशुल्क एक्सटेंशन के साथ ऐसा करने का कोई तरीका है? ऐसा लगता है कि यह काफी सरल होना चाहिए।

+1

ठीक alt + enter ने कुछ भी नहीं किया क्योंकि मैंने शॉर्टकट को सक्षम नहीं किया था और मुझे मेनू में कुछ भी उपयोगी नहीं मिला। भले ही, वह समाधान केवल 30 दिनों तक चलेगा। – Britton

+0

Resharper शॉर्टकट सक्षम किए बिना बहुत बेकार है। अगली बार इसे मौका दें। – cja

+0

आप PropMan नामक एक अच्छा सरल एक्सटेंशन का उपयोग कर सकते हैं, बहुत तेज़ और दोनों तरीकों से काम करता है, https://marketplace.visualstudio.com/items?itemName=OlegShilo.PropMan –

उत्तर

7

आप नोटपैड है, तो ++, आप इसे रेगुलर एक्सप्रेशन से के माध्यम से कर सकता है (काफी बदसूरत, लेकिन काम करता है)

क्या ढूँढ़े: (public)\s+([a-zA-z0-9]+)\s+([a-zA-z0-9]+)\s*\{\s*+get;\s*set;\s*\}

से बदले: private \2 _\3\; \r\n \1 \2 \3 \r\n \{ \r\n get \{ return _\3\; \} \r\n set \{ _\3=value\; OnPropertyChanged\(\"\3\"\)\; \} \r\n \}

यकीन है कि "नियमित अभिव्यक्ति" चिह्नित है

यह क्या लगता है/बदलें स्क्रीन लग रहा है जैसे: FindReplaceImg

और यह करने के लिए से

StartImg

जाता है:

EndImg

संपादित करें:

खोजें: public[^\S\r\n](.+)[^\S\r\n](\b(_\w+|[\w-[0-9_]]\w*)\b)[^\S\r\n]{[^\S\r\n]get;[‌​^\S\r\n]set;[^\S\r\n]}

ब्रिटन के लिए धन्यवाद, यहाँ दृश्य स्टूडियो बराबर है बदलें: private $1 _$2;\r\npublic $1 $2 {\r\nget\r\n{\r\nreturn _$2;\r\n}\r\nset\r\n{\r\n_$2 = value; OnPropertyChanged("$2");\r\n}\r\n}

+1

शायद वही रेगेक्स विजुअल स्टूडियो के अपने खोज/प्रतिस्थापन के साथ भी काम करता है? वाक्यविन्यास थोड़ा अलग हो सकता है, लेकिन यह काम करना चाहिए। – stijn

+0

सबसे सुविधाजनक नहीं है लेकिन यह काम करता है। यदि कोई भी बेहतर कुछ भी नहीं आता है तो मैं इसे उत्तर के रूप में स्वीकार करूंगा। मैं कम से कम विजुअल स्टूडियो के लिए रेगेक्स को परिवर्तित करने में सक्षम था। खोजें: 'सार्वजनिक [^ \ एस \ आर \ n] (। +) [^ \ एस \ आर \ n] (\ b (_ \ w + | [\ w- [0-9 _]] \ w *) \ b) [^ \ एस \ आर \ n] {[^ \ एस \ आर \ n] प्राप्त करें; [^ \ एस \ आर \ n] सेट; [^ \ एस \ आर \ n]} 'बदलें:' निजी $ 1 _ $ 2; \ r \ n सार्वजनिक $ 1 $ 2 {\ r \ nget \ r \ n {\ r \ n वापस _ $ 2; \ r \ n} \ r \ nset \ r \ n {\ r \ n_ $ 2 = मान; OnPropertyChanged ("$ 2"); \ r \ n} \ r \ n} ' – Britton

+0

दान का रेगेक्स ढूंढता है और प्रतिस्थापित करता है, इस प्रकार जेनरिक के साथ गुण नहीं उठाएगा, उदाहरण के लिए 'सार्वजनिक IList ईवेंट {प्राप्त करें; सेट; } 'या शून्य मूल्य प्रकार, उदाहरण के लिए 'सार्वजनिक int? ... '। कोण ब्रैकेट और प्रश्न चिह्न इसे फेंक देते हैं। एक मामूली संशोधन यह तय करता है कि: '(सार्वजनिक) \ s + ([a-zA-z0-9 <> \?] +) \ S + ([a-zA-z0-9] +) \ s * \ {\ s * + मिलता है, \ s * सेट; \ s * \} '। (केवल परिवर्तन '(सार्वजनिक) \ s + ([a-zA-z0-9] +) \ s + ... से '(public) \ s + ([a' से कोण ब्रैकेट और प्रश्न चिह्न का जोड़ है -zA-z0-9 <> \?] +) \ s + ... '।) –

2

दुर्भाग्य से, ऐसा लगता है कि इस प्रकार के कस्टम रिफैक्टरिंग स्निपेट विजुअल स्टूडियो में समर्थित नहीं हैं।

SurroundsWith: प्रलेखन मैं this पाया के माध्यम से देख रहे हैं कोड स्निपेट कोड के एक चयनित टुकड़ा के आसपास रखा जा सकता है।

विस्तार: कर्सर पर कोड स्निपेट डालने की अनुमति देता है।

रिफैक्टरिंग: निर्दिष्ट करता है कि कोड स्निपेट विज़ुअल सी # रिफैक्टरिंग के दौरान उपयोग किया जाता है। रिफैक्टरिंग का उपयोग कस्टम कोड स्निपेट में नहीं किया जा सकता है।

मैं भी आगे बढ़ गया और स्क्रैच से पूरी संपत्ति बनाने के लिए एक स्निपेट बनाया, लेकिन यह केवल नए गुणों के लिए है, मौजूदा नहीं।

<?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> 

मुझे लगता है कि जहाँ तक के टुकड़े जाना के रूप में है, एक दृश्य स्टूडियो एक्सटेंशन (/ या एक regex खोज के रूप में दान सुझाव की जगह) मौजूदा कोड refactor करने के लिए आवश्यक हो जाएगा।

1

मैंने इस कोड का परीक्षण केवल class1 के साथ किया है। लेकिन, यह आपको शुरुआती बिंदु देगा। मैंने चर के लिए फैंसी नामकरण का उपयोग नहीं किया है। कृपया वैरिएबल नामों को उपयुक्त के रूप में बदलें। यह गुणों के सामने private... रखेगा और विधियों को अनदेखा करेगा।

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

namespace ConsoleApplication1 
{ 
public class Class1 
{   
    public int Val 
    { 
     get; 
     set; 
    } 

    public int Val1 
    { 
     get; 
     set; 
    } 

    public void M1() { } 
    } 
} 

कोड है कि ऊपर वर्ग

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(); 
    }   
} 
3

मैं एक बार में कई संपत्तियों के रूपांतरण के लिए Dan's regex का उपयोग कर समाप्त हो गया बदल जाते हैं। मुझे एक दृश्य स्टूडियो एक्सटेंशन भी मिला जिसे PropMan कहा जाता है जो एक समय में एक ही संपत्ति को परिवर्तित करने के लिए अच्छा होता है। बस कर्सर को संपत्ति पर रखें, फिर ऑटो/पूर्ण के बीच कनवर्ट करने के लिए Ctrl+\, Ctrl+\ दबाएं।

संबंधित मुद्दे