使用非默认构造函数创建在运行时确定的类型的对象

时间:2013-11-24 22:54:27

标签: c# dynamic reflection

我有一个抽象类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, ... ])

这就是我所需要的一切。

1 个答案:

答案 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"或类似的位置。