考虑我有这些课程
class BaseClass
{
public int Variable {get; set;}
}
class Class1:BaseClass
{
public Class1()
{
Variable=1;
}
}
class Class2:BaseClass
{
public Class2()
{
Variable=2;
}
}
在另一个地方,我想这样做:
public BaseClass MyMethod(int i)
{
//I want if i is 1 this method returns Class1
//And if i is 2 this method returns Class2.
}
解决方案是使用switch
语句。但是我的命名空间有很多类,并且使用switch会产生很多代码行。
答案 0 :(得分:2)
你的评论"但我的命名空间有很多类,并且使用switch结果很多代码行。"告诉我你做错了什么。
这是经典问题,可以通过工厂模式轻松解决,使用开关将是最佳解决方案:
switch(num) {
case 1: return new Class1();
case 2: return new Class2();
default: throw new ArgumentException();
}
也许你应该拆分命名空间?
其他解决方案有点难看因为你将失去编译时检查,就是使用Activator:
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]);
}
}
答案 1 :(得分:0)
看起来你不想要返回一个类,而是一个类的实例。接下来的问题是你想从哪里获取你的对象?如果它们存储在某些集合中,如
items = new List<BaseClass>();
items.add(new Class1());
items.add(new Class2());
然后你可以写一些类似
的东西public BaseClass MyMethod(int i)
{
return items.First(item=>item.Variable == i);
}
如果您想在每次调用MyMethod
时创建一个新实例,那么您必须使用switch\if
(或使用Reflection
,但这不是推荐的方法)