我有一个返回Type
的方法调用。我想利用这个类型并从C ++中做一些反思。有这样的代码:
MonoClass* klass = (MonoClass*)mono_runtime_invoke (...);
我很确定转向MonoClass*
是不合适的。该函数返回MonoObject*
。如何强制包含对Type
到MonoClass*
的引用的MonoObject *。我希望能够致电:
mono_class_get_properties (type, &iter)
迭代地,稍后。
答案 0 :(得分:3)
如果您可以访问.NET代码,最简单的方法是返回类型的TypeHandle。在本机代码中,您可以通过取消装箱调用的结果来访问MonoType
。
在C#中:
static IntPtr GetUnderlyingTypeHandle()
{
Type type;
// ...
return type.TypeHandle.Value;
}
在本机代码中:
MonoMethod *method = ...; // Retrieve the method to call
MonoObject *obj = mono_runtime_invoke(method, NULL, NULL, NULL);
MonoType *underlyingType = *(MonoType **) mono_object_unbox(obj);
如果您无法更改.NET代码,则必须使用本机代码调用TypeHandle
和Value
getter。
答案 1 :(得分:1)
在C#代码中,您可以返回type.TypeHandle(当然您需要更改方法签名的返回类型),然后您可以取消装箱mono_runtime_invoke()返回值(始终是对象)并将指针强制转换为MonoType *。获得MonoType *后,您可以根据需要使用mono_class_from_mono_type()或mono_type_get_class()获取MonoClass *。
如果你不能改变C#代码,你也可以从C语言中使用mono_runtime_invoke()get_TypeHandle()方法。