प्रतिबिंब का उपयोग करने और Strategy Pattern निम्नलिखित एक वैकल्पिक विकल्प। अपने GradeType कक्षा में)
public class StringArg : ConstructorArgs
{
public string _gradeTypeStringFromXmlFile { get; set; }
public StringArg (string gradeTypeStringFromXmlFile)
{
this._gradeTypeStringFromXmlFile = gradeTypeStringFromXmlFile ;
}
}
public class EnumArg : ConstructorArgs
{
public Enum.GradeType _gradeType { get; set; }
public EnumArg (Enum.GradeType gradeType)
{
this._gradeType = gradeType ;
}
}
3 अब तरीकों बनाएँ:
1) कंस्ट्रक्टर्स तर्क
public abstract class ConstructorArgs
{
}
2) विभिन्न ठोस तर्क वर्गों में से एक दृश्य बनाएँ के लिए एक आधार वर्ग बनाएं प्रतिबिंब के लिए आवश्यक है। ParseArguments गुणों के लिए तर्क स्कैन करता है और इसे ढूंढने वाले प्रत्येक के लिए, यह सेटप्रोपर्टी का उपयोग करके ग्रेड टाइप की संबंधित संपत्ति को अपना मान देता है।चूंकि यह मिलान के लिए संपत्ति नाम का उपयोग करता है, यह दोनों GradeType और ठोस ConstructorArgs भर में एक ही संपत्ति का नाम रखने के लिए महत्वपूर्ण है:
private void SetProperty(String propertyName, object value)
{
var property = this.GetType().GetProperty(propertyName);
if (property != null)
property.SetValue(this, value);
}
private void ParseArguments(ConstructorArgs args)
{
var properties = args.GetType().GetProperties();
foreach (PropertyInfo propertyInfo in properties)
{
this.SetProperty(propertyInfo.Name,
args.GetType().GetProperty(propertyInfo.Name).GetValue(args));
}
}
4) अपने GradeType कक्षा में संबंधित गुण (मन बनाते हैं तो आपको ठीक उसी नाम और प्रकार है कि आप ठोस ConstructorArgs में प्रयोग किया जाता का उपयोग, लेकिन आप प्रकार ConstructorArgs की एक पैरामीटर के साथ अपना GradeType वर्ग के लिए किसी भी उपयोग संशोधक आप की तरह)
public string _gradeTypeStringFromXmlFile { get; set; }
public Enum.GradeType _gradeType { get; set; }
5) एक निर्माता बनाएं उपयोग कर सकते हैं:
public GradeType(ConstructorArgs args)
{
this.ParseArguments(args);
}
6) अब आप एकता में GradeType एक भी निर्माता का उपयोग कर रजिस्टर कर सकते हैं, लेकिन आप तर्क के रूप में विभिन्न प्रकार में पारित कर सकते हैं जब आप उसे ठीक करने:
_unityContainer.RegisterType<IGradeType, GradeType>(
new InjectionConstructor(typeof(ConstructorArgs)));
var args1 = new StringArg(gradeTypeStringFromXmlFile); // string
IGradeType gradeType1 = _unityContainer.Resolve<IGradeType>(
new ResolverOverride[]{new ParameterOverride("args", args1)});
var args2 = new EnumArg(gradeType); // enum
IGradeType gradeType2 = _unityContainer.Resolve<IGradeType>(
new ResolverOverride[]{new ParameterOverride("args", args2)});
आप की योजना बना रहे हैं, तो बार-बार एक चरण में अपने प्रकार का समाधान वह दृष्टिकोण आदर्श नहीं हो सकता है, क्योंकि प्रतिबिंब प्रदर्शन प्रदर्शन के साथ आता है।
क्लास बनाने से पहले ग्रेड टाइप टाइपिंग पर 'Enum.Parse' का उपयोग क्यों नहीं करें? – jgauffin
यह सिर्फ एक सहज डिजाइन की तरह लगता है कि ग्रेड टाइप क्लास स्ट्रिंग को परिवर्तित करता है। – FatAlbert
यह मेरे लिए एक नाजुक समाधान प्रतीत होता है क्योंकि कोई भी मौजूदा मूल्य या तो अपवाद फेंक देगा या कोई त्रुटि छुपाएगा। – jgauffin