c# - Typedefs、C++/CLI、C# + 依赖注入(inject)

标签 c# c++ dependency-injection c++-cli

我有一个用 C# 编写的专用字典,它带有两个通用参数。界面是

public interface IMyDictionary<TKey, TValue> { ... }

及其实现之一

public MyDictionary<TKey, TValue> {...}

我还有一个复杂的 C++ 模板结构,我在我的 C++/CLI 引用类中输入了定义:

typedef boost::some_complex_template<stuff>    MySimpleValueType;

在我的 C++/CLI 引用类构造函数中,我曾经创建字典的一个实例:

MyCppCliClass::MyCppCliClass()
    : _my_dict(gcnew MyDictionary<MySimpleValueType, Something^>())
{...}

现在,如果您喜欢依赖注入(inject),您会注意到这很糟糕。理想情况下,我应该有一个这样的构造函数:

MyCppClass::MyCppCliClass(IMyDictionary<MySimpleValueType, Something^>^ dict){...}

这个类是在 C# 中实例化的,所以现在我的问题是:

鉴于(afaik)C++ 模板类型定义和纯 C++ 类型在 C# 中可用,我如何实例化我现在在 C++/CLI 之外使用的这个有效的 ref 类?

MySimpleValueType 显然必须是 C# 的原生类型,否则 Dictionary 的实例化将失败:

error C3225: generic type argument for 'T1' cannot be '...', it must be a value type
> or a handle to a reference type.

我觉得我应该能够在 C++/CLI 类中定义类型(使用 typedef),但是从外部实例化 Dictionary。 C++/CLI typedef 在 C# 中不可用,所以也许有一种方法可以使用 getter 和 var 的类型推导?有什么想法吗?

最佳答案

boost 是一个不受管理的库。该错误消息告诉您不能在泛型托管类中使用非托管类型。

要解决此问题,请创建一个托管类来容纳您的非托管类,并在容器中使用它。

public ref class MySimpleValueTypeHolder
{
private:
    MySimpleValueType* unmanaged;

public:
    property MySimpleValueType* ValueType { 
        MySimpleValueType* get() { return this->unmanaged; }
    }

    MySimpleValueTypeHolder() { this->unmanaged = new MySimpleValueType(); }
    ~MySimpleValueTypeHolder() { this->!MySimpleValueTypeHolder(); }

    !MySimpleValueTypeHolder()
    {
        if(this->unmanaged != nullptr)
        {
            delete this->unmanaged;
            this->unmanaged = nullptr;
        }
    }
};

Dictionary<MySimpleValueTypeHolder^, Something^>^ foo;

关于c# - Typedefs、C++/CLI、C# + 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16858122/

相关文章:

c# - 在 WPF 中处理文本框上的 Enter 事件时,如何接受 Ctrl+Enter 作为返回?

c# - 如何将数据绑定(bind)到运行的内容?

c# - 如何以编程方式设置软件限制策略

c++ - 无法理解 [basic.link]/6 C++14 示例中的声明 #3

c++ - Qt如何根据另一个ComboBox中的选定选项设置ComboBox的值

dependency-injection - Angular 2 - 依赖注入(inject)和桶装

C#类继承 hell

C++11 std::async 回调

c# - 尝试使用 MEF 将依赖项注入(inject) IIS 托管的 WCF 服务

javascript - Angular 1 TypeScript 项目中的依赖注入(inject)