如何依据Dictionary键数量创建ClassCustom实例并传入SomeCollection?
嘿,这个问题其实分两种情况来处理最稳妥,取决于你的SomeCollection类有没有提供灵活的构造方式——我给你两种方案,你按需选:
方案一:如果SomeCollection支持传入集合(最推荐)
如果SomeCollection有一个接受IEnumerable<ClassCustom>或者List<ClassCustom>这类集合的构造函数,那这是最简单的做法,直接把所有生成的ClassCustom实例打包成集合传进去就行:
// 把Dictionary的每个键值对转换成ClassCustom实例 var customObjects = dictionary.Select(kv => new ClassCustom(kv.Key, kv.Value)).ToList(); // 直接传入集合创建SomeCollection SomeCollection collection = new SomeCollection(customObjects);
这种方式代码简洁、性能也高,是优先考虑的方案。
方案二:如果只能用多参数构造函数(动态调用)
如果SomeCollection只有接受多个单独ClassCustom实例的构造函数(比如new SomeCollection(obj1, obj2, obj3)这种形式),那你需要用反射来动态调用构造函数,因为编译时你不知道要传多少个参数:
// 第一步:生成所有需要的ClassCustom实例 var customInstances = dictionary .Select(kv => new ClassCustom(kv.Key, kv.Value)) .ToArray(); // 第二步:找到匹配的构造函数并调用 // 先尝试找接受ClassCustom数组的构造函数(比如带params关键字的) var constructor = typeof(SomeCollection).GetConstructor(new[] { typeof(ClassCustom[]) }); if (constructor != null) { SomeCollection collection = (SomeCollection)constructor.Invoke(new object[] { customInstances }); } else { // 如果没有数组参数的构造函数,就找参数数量和实例数量匹配的构造函数 constructor = typeof(SomeCollection).GetConstructor( Enumerable.Repeat(typeof(ClassCustom), customInstances.Length).ToArray() ); if (constructor != null) { SomeCollection collection = (SomeCollection)constructor.Invoke(customInstances); } else { throw new InvalidOperationException("找不到适合的SomeCollection构造函数"); } }
这里要注意:如果SomeCollection的构造函数参数数量不固定(比如没有对应数量的重载),反射调用会失败,所以最好提前确认构造函数的定义。
内容的提问来源于stack exchange,提问作者And
相关产品推荐
相关产品推荐

