我有一个用C#编写的专用字典,它需要两个泛型参数。该接口是Typedefs,C++/CLI,C#+依赖注入
public interface IMyDictionary<TKey, TValue> { ... }
和它的一个实现
public MyDictionary<TKey, TValue> {...}
我也有一个复杂的C++模板结构,我在C++/CLI引用类的typedef:
typedef boost::some_complex_template<stuff> MySimpleValueType;
在我C++/CLI ref类的构造函数,我用来创建字典的一个实例:
MyCppCliClass::MyCppCliClass()
: _my_dict(gcnew MyDictionary<MySimpleValueType, Something^>())
{...}
现在,如果你喜欢依赖注入,你会注意到这是不好的。理想情况下,我应该有一个这样的构造:
MyCppClass::MyCppCliClass(IMyDictionary<MySimpleValueType, Something^>^ dict){...}
这个类在C#中实例化,所以现在我的问题:
我怎样才能实例,我使用的是现在的C超出这个有效的引用类++/CLI,假设(afaik)C++模板typedef和纯C++类型在C#中都可用?
MySimpleValueType显然必须是C#本机类型,或字典的实例会失败:
error C3225: generic type argument for 'T1' cannot be '...', it must be a value type
> or a handle to a reference type.
我觉得我应该能在C++/CLI类定义的类型(与类型定义) ,但从外部实例化字典。 C++/CLI typedefs在C#中是不可用的,所以也许有一种方法用getter和var类型演绎?有任何想法吗?
如果MySimpleType可用在字典,这是否意味着它实际上是一个有效的'ValueType'(例如'的boost :: some_complex_template :: number_type'这原来是'int')? –
Medinoc
在调试器中查看它,它告诉我它是一个IMyDictionary。但是我不认为我可以依赖它,因为typedef取决于typedef,而typedef又取决于各种其他类型定义(boost,yknow;))。 –
Wilbert
我相信你的C++/CLI代码不会编译,如果它不是对CLR有效的类型(比如'unsigned __int64' /'System :: UInt64')。所以我猜如果你的代码编译,C#代码可以链接到它。 (毕竟,你实际上并没有将模板暴露给其他程序集,只有模板实例化结果和泛型) – Medinoc