例如,有一个数组 定义了若干名称[ 'a', 'b', 'c' ... ] 。我想通过循环,然后动态创建上述名称的 对象。
下面是伪代码。
class program{
void Main(){
foreach ( var i in array ){
var array[i] = new array[i]();
}
}
}
class a{ vodi index(){} }
class b{ vodi index(){} }
class c{ vodi index(){} }
目前我猜想的一个做法,就是用反射去实现。果然只会动态语言,去写静态语言,感觉跨了一个生态环境啊。
谢谢各位了,通过不断测试,用反射可以实现了。
Type type = Type.GetType("namespace.a");
MethodInfo addMethod = type.GetMethod("index");
addMethod.Invoke(null, null);
但是我又有一个问题了。 如果 class a{ static void index() } 如果不声明public 。 Invoke执行会出错。好奇怪。
1
killergun 2021-03-23 15:05:55 +08:00
想从字符串到 class,需要反射
|
2
finab 2021-03-23 15:17:11 +08:00
var types = new Dictionary<string, Type>
{ {"a", typeof(a)}, {"b", typeof(b)}, {"c", typeof(c)} }; var object = Activator.CreateInstance(types[ array[i] ]); |
3
geelaw 2021-03-23 15:55:03 +08:00
如果你想支持任意类型,需要用反射。如果你想支持有限种类型,可以自己写代码。
要用 Type type 的无参数构造器构造对象,可以用 Expression.Lambda<Func<object>>(Expression.New(type)).Compile() 获得一个委托,此后调用该委托,效率非常高。 |
4
ipwx 2021-03-23 15:59:14 +08:00
那你用 C++ 岂不是一种折磨,都没反射。。
---- 静态语言标准做法:Factory 模式。 |
5
zls3201 2021-03-23 16:16:35 +08:00
ExpandObject 了解一下
|