使用运行时确定的类型实例化对象
我现在的情况是,我想实例化一个在运行时确定类型的对象。 我还需要执行对该类型的显式转换。
像这样的事情:
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 种不同类型执行封送操作。 我还有其他几种方法需要对同一组类型执行类似的操作。 因此,我想将类型确定逻辑与这些方法隔离开来,这样我只需要编写一次,从而使这些方法保持干净和可读。
我必须承认我在设计方面完全是个新手。 有人能提出解决这个问题的好方法吗? 我怀疑可能存在我不知道的合适的设计模式。
I'm in a situation where I'd like to instantiate an object of a type that will be determined at runtime. I also need to perform an explicit cast to that type.
Something like this:
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);
}
This is obviously not valid code, but I hope it conveys the essence of what I'm trying to do. The method I'm actually working on will have to perform the marshaling operation on ~35 different types. I have several other methods that will need to do something similar with the same set of types. So, I'd like to isolate the type-determining logic from these methods so that I only need to write it once, and so that the methods stay clean and readable.
I must admit to being a total novice at design. Could anyone suggest a good approach to this problem? I suspect there might be an appropriate design pattern that I'm unaware of.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
有几种方法可以动态创建某种类型的对象,其中一种是:
并且您将在 obj 中获得 MyClass 的实例。
另一种方法是使用反射:
从返回的 ConstructorInfo 之一中,您可以使用参数“Invoke()”它并返回该类的实例,就像使用“new”运算符一样。
There are several ways you can create an object of a certain type on the fly, one is:
And you'll get an instance of MyClass in obj.
Another way is to use reflection:
And from one of ConstructorInfo returned, you can "Invoke()" it with arguments and get back an instance of the class as if you've used a "new" operator.
您可以大部分执行您所描述的操作,但由于您在编译时不知道类型,因此必须保持实例松散类型; 在使用它的每个点检查它的类型,然后适当地转换它(这对于 c# 4.0 来说是不必要的,它支持 动态):
You can mostly do what you're describing, but since you don't know the type at compile-time, you'll have to keep the instance loosely-typed; check its type at each point you use it, and cast it appropriately then (this will not be necessary with c# 4.0, which supports dynamics):
我认为您正在寻找 Activator.CreateInstance
I think you're looking for Activator.CreateInstance
正如其他人提到的,使用
Activator.CreateInstance
创建运行时确定的Type
实例很容易。 但是,无法像在Marshal.PtrToStructure
行上的示例中那样对其进行转换,因为必须在编译时知道类型才能进行转换。 另请注意,Activator.CreateInstance
不能与 IntPtr 结合使用。如果您的类型有一个公共基类(
Object
除外),您可以将其转换为所述基类型并调用该基类的函数。 否则,只能使用反射来调用函数。所以要么:
或者:
Creating an instance of a run-time determined
Type
is easy, usingActivator.CreateInstance
, as others have mentioned. However, casting it, as you do in your example on theMarshal.PtrToStructure
line is not possible, as the type has to be known at compile time for casting. Also, note thatActivator.CreateInstance
can not be used in conjunction with an IntPtr.If your types have a common base class (other than
Object
), you can cast it to said base type and call functions on that. Otherwise, calling functions will only be possible using reflection.So either:
Or:
你可以变得动态:
You could go dynamic: