2009-08-04 10 views
31

मैं कोड लिखते समय एक दोहराने योग्य कार्य को तेज करने का एक तरीका ढूंढ रहा हूं। मेरे पास रीशेपर है और मैं सोच रहा हूं कि एक अनुकूलन मुझे जो चाहिए वह कर सकता है।क्या रीशेर्पर कोड उत्पन्न कर सकता है जो गुणों को एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट में कॉपी करता है?

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

foo.Name = moo.Name; 
foo.Age = moo.Age; 
foo.City = moo.City; 

इस सरल कोड का स्वचालन कि प्रतियां दाएं से बाएं मूल्यों समय की बचत हो जाएगा और मैं कर रहा हूँ:

यहाँ कोड के प्रकार मैं ReSharper जैसे उपकरण के साथ उत्पन्न की है, देख रहा हूँ है सोच रहा है कि रीशेपर इसे कर सकता है। हालांकि, मैंने इसके लिए खोजों में कुछ भी पॉप-अप नहीं देखा है।

मैं कोडस्मिथ कोड जनरेशन तकनीक या टी 4 टेम्पलेट की तलाश नहीं कर रहा हूं क्योंकि मैं केवल अपनी कक्षा के अंदर इन विशिष्ट लाइनों को उत्पन्न करना चाहता हूं, उत्पन्न नहीं करता हूं और पूरी कक्षा या एक अलग फ़ाइल नहीं।

क्या किसी को कुछ कीस्ट्रोक दबाए जाने का कोई तरीका पता है, ऊपर "foo" और "moo" ऑब्जेक्ट नाम दर्ज करें और क्या टूल इन प्रतिलिपि को कोड की दाएं से बाएं रेखाओं से उत्पन्न करता है?

अद्यतन:

मैं ReSharper करने के लिए इमारत एक्सटेंशन पर कुछ प्रलेखन मिल जाती है और यह शायद उस मार्ग द्वारा प्राप्त किया जा सकता है, लेकिन यह वास्तव में शामिल लगता है।

http://www.jetbrains.net/confluence/display/ReSharper/PowerToys+Pack+3.0+User+Guide

यह एक सप्ताह के अंत में चुनौती की तरह लग रहे करने के लिए जब तक किसी और पहले से ही लिखा है की शुरुआत है।

उत्तर

8

मुझे विश्वास नहीं है कि रिशेर्पर ऐसा कर सकता है, लेकिन ओपन सोर्स AutoMapper कर सकते हैं। ऑटोमैपर के लिए नया? Getting Started पृष्ठ देखें।

+0

मैं इस उपकरण कभी नहीं सुना था। डेटा एक्सेस परतों और डेटा अनुबंधों के साथ इस तरह के कोड को एक आवश्यकता बनाते हुए, यह एक अच्छा उपकरण है! – Vaccano

+2

कुछ मामलों के लिए ऑटोमैपर निश्चित रूप से एक अच्छी बात है, लेकिन बड़ी मात्रा में वस्तुओं के लिए बहुत धीमी हो सकती है। – Telavian

+7

हमने डीटीओ के एक टन के साथ एक बड़े उद्यम ऐप में ऑटोमैपर का उपयोग किया और 6 महीने बाद हमने इसे छोड़ दिया क्योंकि गुणों के सादे पुराने असाइनमेंट की तुलना में इसे बनाए रखना और डीबग करना मुश्किल था। एएम के खिलाफ एक बड़ी हिट नहीं माना जाना चाहिए, लेकिन अंत में हम एक बड़े त्रुटि संदेश को पढ़ने के बजाय कोड की एक पंक्ति को तोड़ना चाहते थे (त्रुटि संदेश सटीक और उपयोगी था)। – TheDev6

-2

बस एक तरफ से दूसरी तरफ मूल्यों की प्रतिलिपि बनाना बहुत बदसूरत है।

आप बेहतर है कि सार्वजनिक संपत्तियों को कॉपी करने के प्रतिबिंब का उपयोग करता है अपनी कक्षाओं में शामिल करने के लिए एक विधि बनाने के लिए मिल सकती है। आप पुनर्जीवित करने के लिए अन्य वर्गों में आप में इस कार्यक्षमता की जरूरत ReSharper में इस विधि को बचा सकता है।

1

यहाँ एक वस्तु क्लोन करने के लिए एक सरल क्लास है। यह बिल्कुल आप के लिए क्या पूछा, लेकिन शायद यह आपके लिए उपयोगी हो सकता है नहीं है:

//.Net 2.0 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Text; 

namespace YourNameSpace { 
    public static class ObjectCloner { 
     public static T Clone<T>(T obj) { 
     using (MemoryStream buffer = new MemoryStream()) { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(buffer, obj); 
      buffer.Position = 0; 
      T temp = (T)formatter.Deserialize(buffer); 
      return temp; 
     } 
     } 
    } 
} 
-1

यह बात है जिसके लिए Cog चमकता है की तरह है। असल में, कोग कोड जनरेशन टूल है। कोड पायथन के माध्यम से उत्पन्न होता है।

+6

तो, आप मेरे प्रश्न का उत्तर देने के लिए एक पाइथन प्रोग्राम का उपयोग करना है ताकि मुझे अपना सी # कोड लिखने में मदद मिल सके? क्या आपके पास इसका एक उदाहरण है? – a7drew

4

मैं @Ben Griswold के साथ सहमत हैं।
अधिकांश स्थितियों में, Automapper जाने का रास्ता है।

लेकिन आप वास्तव में कोड है कि एक और करने के लिए एक वस्तु से प्रतियां गुण, इस कोशिश उत्पन्न करना चाहते हैं जब:

  1. एक नया वर्ग बनाएँ और वर्ग है जिसमें से आप गुण प्रतिलिपि बनाना चाहते हैं से निकाले जाते हैं।
  2. इस नए व्युत्पन्न वर्ग पर राइट-क्लिक करें और 'रिफैक्टर> निकालें इंटरफ़ेस' पर क्लिक करें।
  3. उन सभी गुणों की जांच करें जिन्हें आप प्रतिलिपि बनाना चाहते हैं।
  4. 'इसके बगल में रखें' चुनें क्योंकि यह इंटरफ़ेस केवल अस्थायी होगा।
  5. 'अगला' पर क्लिक करें।
  6. अपनी व्युत्पन्न कक्षा को संशोधित करें ताकि आप अब बेस क्लास से विरासत में नहीं रह सकें और आप केवल अपना नया इंटरफ़ेस लागू कर रहे हैं। लाल झुकाव देखने की उम्मीद है।
  7. अपने कर्सर को लाल squiggle पर रखें और 'सदस्यों को कार्यान्वित करने' के लिए 'ALT-ENTER' दबाएं।
  8. 'समाप्त करें' पर क्लिक करें।
  9. उस अस्थायी इंटरफ़ेस को हटाएं और अपनी कक्षा को संशोधित करें ताकि आप इसे कार्यान्वित नहीं कर सकें।
43

यह वास्तव में आसान है। ReSharper ऐसा नहीं करता है, लेकिन आप एक सुपर डुपर REGEX का उपयोग कर सकते हैं!

दृश्य स्टूडियो में:

public string Email { get; set; } 
    public string CellPhone { get; set; } 
    public int NumChildren { get; set; } 
    public DateTime BirthDate { get; set; } 
  1. अपने सभी गुण का चयन करें। प्रतिलिपि बनाने के लिए CTRL-D दबाएं।

  2. अब CTRL-H को प्रतिस्थापित करने के लिए हिट करें। सुनिश्चित करें कि .* रेगेक्स मिलान के लिए चुना गया है।

  3. बदलें: public [\w?]* (\w*) .* (यह Regex फेरबदल करना पड़ सकता है)

  4. के साथ: dest.$1 = source.$1;

अब आप कुछ सुंदर कोड आप अपने द्वारा चयनित किसी विधि में डाल कर सकते हैं:

dest.Email = source.Email; 
    dest.CellPhone = source.CellPhone; 
    dest.NumChildren = source.NumChildren; 
    dest.BirthDate = source.BirthDate; 
+0

मुझे * ऑटोमैपर * प्लग करने की अनुमति दें। इसके साथ संपत्तियों की प्रतिलिपि बनाना वास्तव में काफी आसान है। यह निश्चित रूप से आपकी स्थिति पर निर्भर करता है। – Jess

8

यह @ जेस द्वारा जवाब से कुछ हद तक व्युत्पन्न है (उसका रेगेक्स वीएस2013 पर मेरे लिए काम नहीं करता है) लेकिनका उपयोग करने के बजायमैं using regex101

उपरोक्त लिंक पर क्लिक करें और अपनी संपत्तियों को Test string फ़ील्ड में पेस्ट करें और आप उन्हें मैप कर लेंगे।

Regex मैं

public [A-Za-z\?]* ([A-Za-z0-9]*) .*

का इस्तेमाल किया और की जगह

Dest.$1 = Source.$1

आशा है कि यह आपको कुछ समय बचाता है।

+0

हाय मटास। हां, मैंने निरर्थक प्रकारों की अनुमति दी और मेरे जवाब में रेगेक्स तोड़ दिया। अब यह तय है। धन्यवाद। – Jess

1

@ मैट्स उत्तर के आधार पर मैंने एक और मजबूत संस्करण using regex101 बनाया जो जेनेरिक, विशेषताओं और टिप्पणियों को अनदेखा करता है और रिक्त स्थान को सामान्य करता है।

Regex: *((\/+.*\n*.*)|(\[.*\]\n*.*))*public [A-Za-z\_\?\<\>]* ([A-Za-z0-9\_]*) .*(\n|)*

बदलें: $4 = person.$4,\n

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

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