您的評論「但我的命名空間有很多類,並使用開關結果很多代碼行。」告訴我你做錯了什麼。
這是經典的問題,很容易被工廠模式解決,使用開關將是最好的解決方案:
switch(num) {
case 1: return new Class1();
case 2: return new Class2();
default: throw new ArgumentException();
}
也許你應該分裂您的命名空間?
與其他解決方案是一個有點難看,因爲你將失去編譯時檢查,是用激活:
return (BaseClass)Activator.CreateInstance("AssemblyName", "Class" + num)
基於評論,100類和必須選擇一個。
public static class AmazingFactory {
private static IDictionary<int, Type> _num2Type;
private static void InitializeFactory() {
var type = typeof(BaseClass);
// get all subclasses of BaseClass
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p));
foreach(var type in types) {
int numberAtTheEnd = int.Parse(Regex.Match(type.Name, @"\d+$").Value);
_num2Type[numberAtTheEnd] = type;
}
}
public static BaseClass Create(int num) {
if (_num2Type == null)
InitializeFactory();
return (BaseClass)Activator.CreateInstance(_num2Type[num]);
}
}
您可以使用反射來做到這一點,但這將會是很多工作,因爲您必須解析方法體並且可能容易出錯。你有沒有考慮使用自定義屬性?就像'[Identifier(1)]'很容易實現。 – thehennyy
您是否需要每次創建新課程,或者您可以多次使用現有課程? – csharpfolk