动态创建 IList 类型的新实例
我的应用程序正在处理 IList。 不同用户定义类型的 IList。 我想我可以使用反射来查看 IList 包含什么类型的对象,然后创建该类型的新实例,然后将其添加到 IList 本身?
因此,在任何时候我都可能正在处理
IList<Customer> l;
,并且我想创建一个新的 Customer 实例
Customer c = new Customer(0, "None")
,然后将其添加到列表中。
l.Add(c);
显然,在运行时动态执行此操作是问题的关键。 希望有人能给我一些指点。 谢谢布伦丹
My application is processing IList's. ILists of different user defined types. I'm thinking that i can use reflection to to see what type of object the IList contains and then create a new instance of that type and subsequently add that to the IList itself?
So at any one time I might be processing
IList<Customer> l;
and I'd like to create a new instance of Customer
Customer c = new Customer(0, "None")
and then add that onto the list
l.Add(c);
Obviously doing this dynamically at run-time is the crux of the problem. Hope somebody can give me some pointers. Thanks brendan
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
试试这个:
用法:
(编辑):
然后试试这个:
Try this:
Usage:
(EDIT):
Try this then:
如果您可以使用无参数构造函数并随后设置属性,那么您可以使您的方法通用,例如: -
其中 MyBase 是公开 int 和 string 属性的类的基础。 如果需要,您可以使用接口而不是基类。
If you can use a parameterless constructor and set the properties afterwards then you can make your method generic, something like:-
Where MyBase is the base for your classes which expose the int and string properties. You can use an interface rather than a base class if you want.
您可以使用
Activator.CreateInstance
方法通过其类型名称(作为字符串)或 System.Type 的实例调用类的构造函数。You can use the
Activator.CreateInstance
method to invoke a constructor for a class via its type name (as a string) or an instance ofSystem.Type
.我认为你应该改变你的设计。 您可以使用抽象工厂模式。 使用反射会降低性能。
这是工厂的代码。
如果你的抽象类没有代码,你可以考虑使用接口。
然后创建客户商店。
用法
如果您想考虑商店类型,请使用
I think you should change your design. You can use abstract factory pattern. Using reflection would degrade performance.
Here is code for factory.
You can consider using interface if your abstract class has no code.
Then create Customer store.
Usage
If you want to consider type of store, use
您可以使用 Type.GetGenericArguments 方法返回泛型类型 IList的类型参数。 然后调用适当的构造函数。
You could use the Type.GetGenericArguments method to return the type argument of the generic type IList<T>. Then invoke the appropriate constructor.
是的,抱歉,我应该提到我将要处理的对象集将有一个接受 int 和字符串的构造函数。
Yes sorry i should have mentioned that the set of objects i will be processing will have a constructor that accepts an int and a string.
这里最大的问题是:如果你不知道类型,你怎么知道如何制作新的? 并不是世界上的每种类型都有一个接受 int 和 string 的构造函数。
The big problem here is: If you don't know the type, how do you know how to make a new one? Not every type in the world has a constructor that takes an int and a string.
获取 IList 类型的最佳方法是查看索引器的属性类型!
The best way to get the type of the IList is to look at the property type of the indexer!