使用反射并按照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扫描属性的参数以及它找到的每个参数,它使用SetProperty将其值复制到GradeType的相应属性。由于它使用的属性名称匹配,它保持相同的属性名跨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使用相同的名称和类型,但你可以用你喜欢的任何访问修饰符)
public string _gradeTypeStringFromXmlFile { get; set; }
public Enum.GradeType _gradeType { get; set; }
5)创建一个构造你的GradeType类类型ConstructorArgs的参数:
public GradeType(ConstructorArgs args)
{
this.ParseArguments(args);
}
6)现在,你可以注册使用一个构造函数在Unity 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)});
如果您计划重复解决一个迭代的类型该方法可能并不理想,因为反射带来了性能损失。
为什么在创建类之前不要在gradeType字符串上使用'Enum.Parse'? – jgauffin 2012-01-13 15:46:00
它只是感觉像GradeType类转换字符串的直观设计。 – FatAlbert 2012-01-13 16:01:57
对我来说这似乎是一个脆弱的解决方案,因为任何不存在的值都会引发异常或隐藏错误。 – jgauffin 2012-01-13 17:54:34