C# 如何像动态语言那样动态创建对象呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Felldeadbird
V2EX    C#

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

  •  
  •   Felldeadbird 2021-03-23 15:03:42 +08:00 2387 次点击
    这是一个创建于 1737 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言    2021-03-23 16:04:16 +08:00

    谢谢各位了,通过不断测试,用反射可以实现了。

    Type type = Type.GetType("namespace.a"); MethodInfo addMethod = type.GetMethod("index"); addMethod.Invoke(null, null); 

    但是我又有一个问题了。 如果 class a{ static void index() } 如果不声明public 。 Invoke执行会出错。好奇怪。

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

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

    静态语言标准做法:Factory 模式。
    zls3201
        5
    zls3201  
       2021-03-23 16:16:35 +08:00
    ExpandObject 了解一下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1440 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 16:49 PVG 00:49 LAX 08:49 JFK 11:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86