一尘不染

使用运行时确定的类型实例化对象

c#

我处于一种情况下,我想实例化一个将在运行时确定的类型的对象。我还需要执行对该类型的显式转换。

像这样:

static void castTest(myEnum val)
{
    //Call a native function that returns a pointer to a structure
    IntPtr = someNativeFunction(..params..);

    //determine the type of the structure based on the enum value
    Type structType = getTypeFromEnum(val);

    structType myStruct = (structType)Marshal.PtrToStructure(IntPtr, structType);
}

这显然不是有效的代码,但我希望它传达了我正在尝试做的本质。我实际上正在使用的方法将必须在约35种不同类型上执行封送处理操作。我还有其他几种方法需要对同一组类型执行类似的操作。因此,我想从这些方法中分离出类型确定逻辑,这样我只需要编写一次即可,从而使方法保持清晰易读。

我必须承认自己是设计的新手。谁能建议一个解决这个问题的好方法?我怀疑可能有一个我不知道的合适的设计模式。


阅读 193

收藏
2020-05-19

共1个答案

一尘不染

您可以通过多种方式即时创建某种类型的对象,一种是:

// determine type here
var type = typeof(MyClass);

// create an object of the type
var obj = (MyClass)Activator.CreateInstance(type);

然后您将在obj中获得MyClass的实例。

另一种方法是使用反射:

// get type information
var type = typeof(MyClass);

// get public constructors
var ctors = type.GetConstructors(BindingFlags.Public);

// invoke the first public constructor with no parameters.
var obj = ctors[0].Invoke(new object[] { });

从返回的ConstructorInfo之一中,您可以使用参数对其进行“ Invoke()”,并获得该类的实例,就好像您使用的是“ new”运算符一样。

2020-05-19