Yansıma kullanarak ve Strategy Pattern aşağıdaki alternatif bir seçenek. yöntemlerini oluşturmak için GradeType sınıfında Şimdi)
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) markalar argümanlar
public abstract class ConstructorArgs
{
}
) farklı beton argümanlar sınıfların sıralandığında için bir temel sınıf oluşturma Yansıma için gerekli. ParseArguments, özellikleri için ve buldukları her biri için bir ardı ardına tarar, değerini SetProperty'yi kullanarak GradeType öğesinin ilgili özelliğine kopyalar.yani gerekir (zihin ilgili özellikler oluşturmak için GradeType sınıfta
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): Bu eşleştirme için özellik adını kullandığı için GradeType ve beton ConstructorArgs ikisinde birden aynı özellik adını tutmak önemlidir tam olarak beton ConstructorArgs kullanılan aynı isim ve türlerini kullanmak ancak tip ConstructorArgs bir parametre ile GradeType sınıf için istediğiniz herhangi bir erişim değiştirici)
public string _gradeTypeStringFromXmlFile { get; set; }
public Enum.GradeType _gradeType { get; set; }
5) bir kurucu oluşturun kullanabilirsiniz:
public GradeType(ConstructorArgs args)
{
this.ParseArguments(args);
}
6) Şimdi tek kurucu kullanılarak Unity GradeType kayıt olabilirsiniz ancak bunu çözmek için zaman argüman olarak farklı tipte geçirebilirsiniz:
_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)});
art arda bir yineleme içinde türünü çözmek planlıyorsanız Bu yaklaşım ideal olmayabilir çünkü Yansıma bir performans cezasıyla birlikte gelir.
neden sınıf oluşturmadan önce gradeType dizesinde 'Enum.Parse' kullanılmıyor? – jgauffin
sadece ClassType sınıfının dizeyi dönüştürdüğü sezgisel bir tasarım gibi hissediyor. – FatAlbert
Var olmayan herhangi bir değer bir istisna atacağından veya bir hata gizleyeceğinden bana göre kırılgan bir çözüm gibi görünüyor. – jgauffin