我有一个抽象类A和实现B和C.我还有一个存储A对象信息的数据库。该表有一个名为“Name”的列,用于确定是否应使用数据构建B或C.
public abstract class A { }
public class B,C : A
{
public B,C(TableData data)
{
//Do Stuff.
}
}
public class TableData
{
string Name { get; set; }
}
现在,如果Name是“Banana”,我希望这个创建一个B的实例;如果它是“Carrot”我希望这个创建一个C:
的实例A myObj = { Reflection? }
其中Reflection以某种方式使用B或C构造函数并将此新创建的对象分配给myObj。我已经研究过使用反射,但是那里允许使用非默认构造函数的大多数方法都非常复杂,并且采用了以前从未使用过的参数:
http://msdn.microsoft.com/en-us/library/System.Activator.CreateInstance(v=vs.110).aspx http://msdn.microsoft.com/en-us/library/dd384354.aspx
有更好的方法吗?如果没有,我如何使用第二个链接动态分配此类型?
如果有办法简单地这样做:
CreateInstance("Namespace.Type", [ ConstructorParam1, ConstructorParam2, ... ])
这就是我所需要的一切。
答案 0 :(得分:5)
如果您希望有一个参数需要TableData
,那么这只是:
Type type = Type.GetType(qualifiedName);
TableData tableData = ...
A obj = (A)Activator.CreateInstance(type, tableData);
注意到qualifiedName
应该包含汇编信息;如果没有,你首先要解决这个问题 - 也许是:
Type type = typeof(A).Assembly.GetType(fullName);
其中B
/ C
等与A
位于同一个程序集中,fullName
为"Namespace.B"
或类似的位置。