使用反射並按照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