Chr*_*ner 5 .net c++ generics native
在.NET程序中,我可以通过以下方式创建泛型类型:
System::Type::MakeGenericType(...)
Run Code Online (Sandbox Code Playgroud)
必须有一种方法可以在本机C++中为.NET类型(带_TypePtr)做到这一点.我正在托管我自己的CLR实例而不使用C++/CLI.(这是一个如何做到这一点的例子.)我的方法是:
_TypePtr BuildGenericType(_TypePtr spGenericType, _TypePtr spTypeArgs[])
{
return spGenericType-> ..... ???
}
Run Code Online (Sandbox Code Playgroud)
但是没有类似的方法MakeGenericType,我不知道在哪里找到它.关于如何解决这个问题的任何想法?
最后我自己找到了解决方法。首先,我需要一个包装 System::TypeBuilder 的附加程序集
/// <summary>
/// Wrapper for System::TypeBuilder
/// </summary>
public class TypeBuilder
{
/// <summary>
/// Creates a generic type out of the given arguments.
/// </summary>
/// <param name="generic">The unqualified generic type.</param>
/// <param name="typeArgs">The typearguments for the generic type.</param>
/// <returns>The qualified generic type.</returns>
public static Type MakeGenericType(Type generic, params Type[] typeArgs)
{
return generic.MakeGenericType(typeArgs);
}
}
Run Code Online (Sandbox Code Playgroud)
我从 c++ 加载这个附加程序集
我在那里运行了这些性感的线条,其中 CLRAssembly 是 clr 的抽象层。
_TypePtr CLRAssembly::BuildType(_TypePtr spGenericType, _TypePtr spTypeArgs[])
{
LONG index = 0;
SAFEARRAY* psaArgs = SafeArrayCreateVector(VT_VARIANT, 0, 1 + (sizeof(spTypeArgs)/sizeof(_TypePtr)));
SafeArrayPutElement(psaArgs, &index, &_variant_t((IUnknown*)spGenericType, true));
for(int i = 0; i < sizeof(spTypeArgs)/sizeof(_TypePtr); i++) {
index++;
SafeArrayPutElement(psaArgs, &index, &_variant_t((IUnknown*)spTypeArgs[i], true));
}
return (_TypePtr)clraAssemblyHelper->RunMethod(L"AssemblyHelper.TypeBuilder", L"MakeGenericType", psaArgs);
}
Run Code Online (Sandbox Code Playgroud)
最后我可以像这样运行我的示例方法:
DDDElements::Defs* ListDefs::AddNew()
{
_TypePtr params[1];
params[0] = clra->BuildType(L"DDD.Elements.Defs");
_TypePtr spType = clra->BuildType(clra->BuildType(L"DDD.ElementList`1"), params);
return new DDDElements::Defs(clr, clra,
clra->RunMethod(spType, vtCLRObject, L"AddNew")
);
}
Run Code Online (Sandbox Code Playgroud)
最后效果还不错。:)
/解决了