कौन से टूल्स/पुस्तकालय मौजूद हैं जो एक संरचना ले लेंगे और स्वचालित रूप से एक नए निर्माता बनाने के लिए एक अपरिवर्तनीय रैपर और "बिल्डर" वर्ग भी उत्पन्न करेंगे?अपरिवर्तनीय वर्ग और मिलान करने वाले बिल्डर वर्ग की स्वचालित पीढ़ी
उदाहरण इनपुट:
struct Foo
{
public int apples;
public int oranges;
public Foo Clone() {return (Foo) base.MemberwiseClone();}
}
उदाहरण आउटपुट:
public class ImmutableFoo // could probably be a struct
{
private Foo snapshot;
internal ImmutableFoo(Foo value) { this.snapshot = value; }
public FooBuilder Builder() { return new FooBuilder(snapshot); }
public int Apples { get { return snapshot.apples; } }
public int Oranges { get { return snapshot.oranges; } }
}
public class FooBuilder
{
private Foo state;
public int Apples { get { return state.apples; } set { state.apples = value; } }
public int Oranges { get { return state.oranges; } set { state.oranges = value; } }
public FooBuilder() { }
internal FooBuilder(Foo toCopy) { state = toCopy.Clone(); }
public ImmutableFoo Build()
{
ImmutableFoo result = new ImmutableFoo(state);
state = state.Clone();
return result;
}
}
इस तरह के एक "उपकरण" एक IDE प्लगइन हो सकता है या प्रतिबिंब का उपयोग रन-टाइम में नया वर्ग उत्पन्न कर सकता है।
उदाहरण सी # में है, लेकिन मैं किसी भी स्थिर टाइप OO भाषा (जावा, स्काला, सी ++ आदि)
वांछनीय सुविधाओं के लिए एक समाधान में रुचि होगी:
- तरीकों पुन: बनाता है बिल्डर कक्षा में struct से
- पुन: बनाता है अपरिवर्तनीय कक्षा में struct से अविध्वंसक तरीक़ों (esp।
Equals()
औरGetHashCode()
और किसी भी इंटरफ़ेस विधि) - इसके अलावा एक ०१२३८३१७८८२ उत्पन्न करता हैइंटरफ़ेस में प्रत्येक संरचना सदस्य के लिए केवल-पढ़ने योग्य गुण होते हैं, जो अपरिवर्तनीय और निर्माता दोनों द्वारा कार्यान्वित किए जाते हैं।
- यदि किसी फ़ील्ड की कक्षा में एक अपरिवर्तनीय समकक्ष है, तो अपरिवर्तनीय वर्ग में अपरिवर्तनीय संस्करण का उपयोग करता है (How do I create a builder in C# for an object that has properties that are referenc types? भी देखें) उदा।
List
->ReadOnlyCollection
या इसी तरह के। - वैकल्पिक रूप से इनपुट के रूप में बिल्डर वर्ग ले (जहां बिल्डर स्वत: गुण के बजाय का उपयोग करता है एक struct को सौंपने की।)
Clone
विधि की आवश्यकता नहीं है पूर्वनिर्धारित किया जाना
"आप एक उपकरण का उपयोग नहीं करना चाहिए इस तरह ... "जवाब भी स्वागत है।
5) अपने कोड का विश्लेषण करने के लिए रोज़लिन का उपयोग करें, और निर्माता को बनाने के लिए टी 4 –