2011-07-29 11 views
5

は私がcreate a generic typeですることができます:CLRをホストするネイティブC++アプリケーションで汎用.NETタイプを作成するには(C++/CLIを使用しないでください)? .NETプログラムで

System::Type::MakeGenericType(...) 

_TypePtrで).NET型のネイティブC++でそれをする方法があるに違いありません。 私は自分自身のCLRインスタンスをホストしていますが、C++/CLIは使用していません。

​​

しかし、そこMakeGenericTypeようには方法はありません、と私はどこそれを見つけることがわからない:(。Here's an example of how that can be done)そのための私のアプローチがあります。どのようにこれを解決するための任意のアイデアですか?

+0

私はそれが理にかなっていると思うので、このC++/CLIにタグを付けました。私が間違っているなら私を訂正してください。 –

+0

cliのホストされたclr。 –

+0

@nemcija:そうすることは本当に稀です。あなたの質問を編集して言及しました。 – Puppy

答えて

3

最後に、自分で回避策を見つけました。 は、最初に私はCLRAssemblyは、CLRのための抽象化層であるシステム:: 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); 
    } 
} 

私はC++

からロードして、そこに私はこれらのセクシーなラインを実行します。この追加assemlyを、ラップ追加のアセンブリを必要としています。

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") 
    ); 
} 

最後に、それはかなり良い作品:

_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); 
} 

最後に、私はこのように私の例の方法を実行することができます。 :)

/解決済み

関連する問題