V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Felldeadbird
V2EX  ›  C#

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

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

    例如,有一个数组 定义了若干名称[ '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   ·   实用小工具   ·   1075 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:06 · PVG 03:06 · LAX 11:06 · JFK 14:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.