Создать экземпляр среды выполнения, определенной Type
, легко, используя Activator.CreateInstance
, как уже упоминали другие. Однако приведение к нему, как вы делаете в своем примере в строке Marshal.PtrToStructure
, невозможно, так как тип должен быть известен во время компиляции для преобразования. Также обратите внимание, что Activator.CreateInstance
нельзя использовать вместе с IntPtr.
Если у ваших типов есть общий базовый класс (отличный от Object
), вы можете привести его к указанному базовому типу и вызвать его функции. В противном случае вызов функций будет возможен только с помощью отражения.
Так что либо:
static void castTest(myEnum val)
{
//Call a native function that returns a pointer to a structure
IntPtr val = someNativeFunction(..params..);
//determine the type of the structure based on the enum value
Type structType = getTypeFromEnum(val);
BaseClass myStruct = (BaseClass)Marshal.PtrToStructure(IntPtr, structType);
myStruct.SomeFunctionDeclaredInBaseClass();
}
Или:
static void castTest(myEnum val)
{
//Call a native function that returns a pointer to a structure
IntPtr val = someNativeFunction(..params..);
//determine the type of the structure based on the enum value
Type structType = getTypeFromEnum(val);
object myStruct = Marshal.PtrToStructure(IntPtr, structType);
MemberInfo[] function = FindMembers(MemberTypes.Method, BindingFlags.Public | BindingFlags.Instance,
(MemberFilter)delegate(MemberInfo info, object filter)
{
return info.Name == filter.ToString();
}, "SomeFunction");
if (mi.Length > 0 && mi[0] is MethodInfo)
((MethodInfo)mi[0]).Invoke(myStruct, ..params..);
}