如何用表达式创建一个activator.createinstance()?

问题描述 投票:0回答:1

方法

activator.CreateInstance()
众所周知是缓慢的。直接调用 var
X = new Class()
是最快的。不过
Expression.New()
编译也很快。

但是我不知道如何让它在构造函数中使用可变数量的参数。

所以我的问题是:我应该如何创建一个带有表达式的

func<Type, object[], object>
来创建一个实例,其中对象数组包含构造函数的参数。

最终目标是这样做:

var a = Creator(typeof(ClassA),new[]{1,2}); //ClassA has 2 params
var b = Creator(typeof(ClassB),new[]{"some text"}); //ClassB has only 1 param

我读过

Expression.New()
有可能有多个参数。

c# expression createinstance
1个回答
0
投票

评论中的上述问题也可以带来一些启发,但是关于

Expression.New
和参数:

    public class Dummy
    {
        public Dummy(int a) => A = a;
        public int A;
    }

    static void Main(string[] args)
    {
        var classTypeInfo = typeof(Dummy).GetTypeInfo();
        var constructorInfo = classTypeInfo.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).First();
        var parameters = constructorInfo.GetParameters().Select(p => Expression.Parameter(p.ParameterType, p.Name)).ToArray();
        var body = Expression.New(constructorInfo, parameters);
        var lambda = Expression.Lambda(body, parameters);
        var @delegate = lambda.Compile();
        var func = (Func<int, Dummy>)@delegate;
        var value = func(10);

        Console.WriteLine(value.A);  // 10
    }
© www.soinside.com 2019 - 2024. All rights reserved.