我想实例化一个类型将在运行时确定的对象.我还需要对该类型执行显式转换.

大概是这样的:

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种不同的类型执行封送处理操作.我还有其他几个方法需要对同一组类型执行类似的操作.因此,我想将类型确定逻辑从这些方法中分离出来,这样我只需要编写一次,这样方法就可以保持干净和可读性.

我必须承认自己在设计方面完全是个新手.有谁能提出解决这个问题的好办法吗?我怀疑可能有一种我不知道的合适的设计模式.

推荐答案

在飞翔上创建某个类型的对象有几种方式,一种是:

// 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"运算符一样返回该类的实例.

.net相关问答推荐

实体框架核心:Azure容器应用程序的执行超时已过期

安装特定主要版本的DotNet SDK最新版本

.NET Blazor-使用子组件中的处理程序方法进行双向数据绑定

查询 MongoDb 中嵌入式文档中的一个字段,该字段抛出调用运算符的左侧必须是对持久属性的直接访问

问:在 Blazor WASM 应用程序中存储 api 密钥的最佳方式是什么?

有什么方法可以使用 .NET 应用程序使用 git 吗?

extern 在 C# 中是如何工作的?

Linq查询分组并 Select 第一个项目

使用只读属性或方法?

如何使用 NUnit(或可能使用另一个框架)测试异步方法?

如何退出所有正在运行的线程?

在安全处理异常时避免首次机会异常消息

VB.NET 与 C# 整数除法

互锁且易变

使用 XmlSerializer 将空 xml 属性值反序列化为可为空的 int 属性

DataGridView 在我的两个屏幕之一上的可怕重绘性能

无锁多线程适用于真正的线程专家

如何使用通用扩展方法中的字符串列名在 IQueryable 上应用 OrderBy?

从字节数组中读取 C# 中的 C/C++ 数据 struct

作者主签名的时间戳发现了一个建链问题:UntrustedRoot: self-signed certificate in certificate chain