ksk*_*d19 4 c# generics constructor
我有一个基本抽象类,有几个类扩展和覆盖它,但它们都有相同的构造函数.现在我从switch语句中调用每个构造函数:
case 1: return new A(arg1); // arg is int
Run Code Online (Sandbox Code Playgroud)
等,大约10个班级.是否有一种方法可以使用泛型或委托来创建一个方法来获取类名并使用参数实例化该类型?
这会有所帮助,因为如果我对构造函数进行更改,我还必须更改每个实例.
代表将是最直接的,但研究表明不会为代表分配构造函数.
附加:我现在使用笔记本电脑上网而不仅仅是我的手机,所以这里有一些代码.
这是现在发生的事情的一个例子:
switch (new Random().Next(4))
{
case 3:
// classA : baseClass, args{int, bool, otherClass}
return new classA(arg1, arg2, arg3);
case 2:
// classB : baseClass, args{int, bool, otherClass}
return new classB(arg1, arg2, arg3);
case 1:
// classC : baseClass, args{int, bool, otherClass}
return new classC(arg1, arg2, arg3);
case 0:
// classD : baseClass, args{int, bool, otherClass}
return new classD(arg1, arg2, arg3);
default:
continue;
}
Run Code Online (Sandbox Code Playgroud)
我想在块的末尾用三个参数调用一个实例化器.
我想到的一个解决方案是make和instantiator类与此类似:
ClassInstantiator inst = new ClassInstantiator(arg1, arg2, arg3);
switch(new Random().Next(4))
{
case 4:
return inst.instantiate<classA>();
...
}
Run Code Online (Sandbox Code Playgroud)
这已经内置于语言中,还是有人知道更优雅的解决方案?
你无法摆脱这样一个事实:某些东西必须在条件基础上决定构建什么,但你可以封装它.我可以向您展示最受欢迎的GOF模式之一:http://en.wikipedia.org/wiki/Factory_method_pattern
例如
public abstract class MyBase(string name){}
public class Concrete1 : MyBase{}
public class Concrete2 : MyBase{}
public class MyFactory
{
public MyBase Create(Criteria criteria)
{
//conditional logic/reflection
}
}
Run Code Online (Sandbox Code Playgroud)
可以放在泛型类型上的唯一与构造函数相关的约束是new()约束,它需要一个公共无参数构造函数.
你可以用反射; 该示例假定所有相关类型都有一个带构造函数的构造函数,如示例所示,并且调用抽象基类B:
public T CreateInstance<T>(int i) where T : B
{
return (T)Activator.CreateInstance(typeof(T), i);
}
Run Code Online (Sandbox Code Playgroud)
然后你会这样称呼它:
A a = CreateInstance<A>(3);
Run Code Online (Sandbox Code Playgroud)