C#11下使用Activator.CreateInstance传递可变参数的问题
在C# 11(.NET 7)中实现类似Spread语法的参数传递给Activator.CreateInstance
针对你需要用Activator.CreateInstance创建Monocle.Entity子类实例、替代C#12 Spread语法的需求,C#11里有两种直接可行的方式:
1. 直接使用Activator.CreateInstance(Type, object[])重载
这个重载本身就支持接收参数数组,并自动将数组元素“展开”作为构造函数的参数传入,完全不需要额外语法。只要你的参数数组元素的数量、类型顺序和目标子类的构造函数完全匹配即可。
示例代码:
// 假设你的Entity子类是CustomEntity,构造函数为CustomEntity(int id, string name) Type targetType = typeof(CustomEntity); object[] constructorParams = new object[] { 1001, "MyCustomEntity" }; Monocle.Entity instance = (Monocle.Entity)Activator.CreateInstance(targetType, constructorParams);
你之前遇到的MissingMethodException本质是参数数组的元素和目标构造函数不匹配(数量不足、类型不对),和参数传递方式无关,这点需要注意。
2. 混合固定参数与动态参数数组时,拼接数组
如果需要部分参数是固定值,部分来自动态数组,C#11没有原生Spread语法,但可以通过数组拼接来实现:
示例代码:
// 构造函数为CustomEntity(int fixedId, string name, bool isActive) int fixedId = 2001; object[] dynamicParams = new object[] { "DynamicEntity", true }; // 拼接固定参数和动态参数数组 object[] allParams = new object[] { fixedId }.Concat(dynamicParams).ToArray(); var instance = (Monocle.Entity)Activator.CreateInstance(targetType, allParams);
内容的提问来源于stack exchange,提问作者The Mayday Man
相关产品推荐
相关产品推荐

