C# 如何像动态语言那样动态创建对象呢?

2021-03-23 15:03:42 +08:00
 Felldeadbird

例如,有一个数组 定义了若干名称[ '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(){} }

目前我猜想的一个做法,就是用反射去实现。果然只会动态语言,去写静态语言,感觉跨了一个生态环境啊。

1737 次点击
所在节点    C#
5 条回复
killergun
2021-03-23 15:05:55 +08:00
想从字符串到 class,需要反射
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] ]);
geelaw
2021-03-23 15:55:03 +08:00
如果你想支持任意类型,需要用反射。如果你想支持有限种类型,可以自己写代码。

要用 Type type 的无参数构造器构造对象,可以用 Expression.Lambda<Func<object>>(Expression.New(type)).Compile() 获得一个委托,此后调用该委托,效率非常高。
ipwx
2021-03-23 15:59:14 +08:00
那你用 C++ 岂不是一种折磨,都没反射。。
----

静态语言标准做法:Factory 模式。
zls3201
2021-03-23 16:16:35 +08:00
ExpandObject 了解一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/764277

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX