मुझे "बाएं/दाएं" विधियों का एक समूह होने से नफरत है। प्रत्येक बार जब कोई संपत्ति जोड़ या हटा दी जाती है, तो मुझे प्रत्येक विधि को ठीक करना होगा। और कोड खुद ही दिखता है ... गलत।रचनाकारों और तुलना को सरल बनाने के लिए प्रतिबिंब का उपयोग कैसे करें?
public Foo(Foo other)
{
this.Bar = other.Bar;
this.Baz = other.Baz;
this.Lur = other.Lur;
this.Qux = other.Qux;
this.Xyzzy= other.Xyzzy;
}
सच यह सिर्फ एक unrolled पाश कि गुण के माध्यम से दोहराता है, उन्हें वस्तुओं के बीच कॉपी है। तो उस तथ्य के बारे में ईमानदार क्यों नहीं हो? बचाव के प्रति प्रतिबिंब!
public Foo(IFoo other)
{
foreach (var property in typeof(IFoo).GetProperties())
{
property.SetValue(this, property.GetValue(other, null), null);
}
}
मैं सिर्फ एक प्रतिमान मैं सी # पर लुआ से सीखा के लिए मजबूर करने की कोशिश कर रहा हो सकता है लेकिन इस विशिष्ट उदाहरण मेरे लिए भी बदबूदार प्रतीत नहीं होता। यहां से, मैंने कुछ और जटिल चीजें करना शुरू कर दिया जो खेतों के क्रम में संवेदनशील थे। उदाहरण के लिए, क्षेत्रों से एक स्ट्रिंग की रचना करने के बजाय लगभग समान if
बयान के ढेर होने, मैं सिर्फ उन पर वांछित क्रम में पुनरावृति:
public override string ToString()
{
var toJoin = new List<string>();
foreach (var property in tostringFields)
{
object value = property.GetValue(this, null);
if (value != null)
toJoin.Add(value.ToString());
}
return string.Join(" ", toJoin.ToArray());
}
private static readonly PropertyInfo[] tostringFields =
{
typeof(IFoo).GetProperty("Bar"),
typeof(IFoo).GetProperty("Baz"),
typeof(IFoo).GetProperty("Lur"),
typeof(IFoo).GetProperty("Qux"),
typeof(IFoo).GetProperty("Xyzzy"),
};
तो अब मैं iterability मैं चाहता था है, लेकिन मैं अभी भी मेरे द्वारा रुचि रखने वाली प्रत्येक संपत्ति को प्रतिबिंबित करने वाले कोड के ढेर हैं (मैं अलग-अलग क्रम में गुणों के एक अलग सेट का उपयोग करके तुलना करने के लिए भी कर रहा हूं)। इससे भी बदतर मजबूत टाइपिंग का नुकसान है। यह वास्तव में गंध शुरू कर रहा है।
अच्छी तरह से आदेश को परिभाषित करने के लिए प्रत्येक संपत्ति पर विशेषताओं का उपयोग करने के बारे में क्या? मैंने इस सड़क को शुरू कर दिया और वास्तव में यह अच्छी तरह से काम किया, लेकिन यह सिर्फ पूरी चीज फूला हुआ देखा। यह बहुत ही महत्वपूर्ण रूप से काम करता है, लेकिन मैं हमेशा उन्नत सुविधाओं का उपयोग करने से सावधान हूं क्योंकि वे "साफ" हैं। इस तरह से overkill में प्रतिबिंब का उपयोग कर रहा है? क्या मुझे याद आ रही बाएं/दाएं कोड की समस्या का कोई अन्य समाधान है?
एक भाषा टैग को जोड़ने के i'dd प्राप्त करने के लिए अधिक दर्शकों – Toad
ध्यान रखें, प्रतिबिंब हमेशा सी # में एक प्रदर्शन हिट के साथ आता है। आप इस तरह फूओस कितनी बार छेड़छाड़ करेंगे? प्रतिबिंब का उपयोग करने के लिए एक हाइब्रिड समाधान हो सकता है। प्रवेश करें, और परिणामस्वरूप कोड कैश करें - धीमी स्टार्टअप, तेज़ निष्पादन। – zildjohn01
सी # 4.0 संकलक में बनाया के साथ आ रहे हैं, कि कोड को पैदा करने में मददगार हो सकता है और इसका इस्तेमाल कर सकते हैं, अब हम भी इसी तरह की समस्या है, लेकिन हम एक्सएमएल कक्षा संरचनाओं का उपयोग करके समाधान बनाया गया है और हम अपने ही कोड पीढ़ी विधि का उपयोग वर्गों है कि होगा निर्माण करने के लिए के लिए है कई अन्य विधियों को उत्पन्न करें जो memebers के नाम पर निर्भर हैं, इसकी मूल रूप से एक ORML है लेकिन सब कुछ स्वचालित करता है। –