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

jok*_*der 2 c# reflection dynamic

我有一个抽象类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; }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果Name是"Banana",我希望这个创建一个B的实例; 如果它是"Carrot"我希望这个创建一个C的实例:

A myObj = { Reflection? }
Run Code Online (Sandbox Code Playgroud)

反射以某种方式使用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, ... ])
Run Code Online (Sandbox Code Playgroud)

这就是我所需要的一切.

Mar*_*ell 5

如果你期望有一个参数需要a TableData,那么这只是:

Type type = Type.GetType(qualifiedName);
TableData tableData = ...
A obj = (A)Activator.CreateInstance(type, tableData);
Run Code Online (Sandbox Code Playgroud)

注意到qualifiedName应包括装配信息; 如果没有,你会想要先解决 - 也许:

Type type = typeof(A).Assembly.GetType(fullName);
Run Code Online (Sandbox Code Playgroud)

其中B/ C等是在相同的组件A,并且其中fullName"Namespace.B"或类似的.