在Microsoft Bond的子命名空间中使用十进制转换失败

时间:2017-11-17 18:43:31

标签: c# bond

按照此处的示例:https://github.com/Microsoft/bond/tree/master/examples/cs/core/decimal

我试图在不在基本命名空间中的结构中使用decimal并获得异常“类型'System.Decimal'的表达式不能用于赋值类型'System.ArraySegment`1 [System.Byte] “”。

如果我将所有结构保留在同一名称空间中,那么一切都很有效。我必须做某种类型的排位赛吗?

我已经整理了一个小项目和几个单元测试来演示:https://github.com/oculuss/BondDecimalExample

TestA将所有内容都放在同一名称空间中。 TestB有一些子命名空间(并且会破坏)。

1 个答案:

答案 0 :(得分:1)

必须在相同的程序集和名称空间中定义BondTypeAliasConverter作为表示使用类型别名的Bond模式的类或程序集/名称空间其中一种被转换的类型。"它不能在父命名空间中定义。搜索算法并不聪明。 :-)因此,在TestB中,您需要将BondTypeAliasConverter类放在C#名称空间" BondExampleB.Global.SecondType.SecondTypeA" (或者您在C#中将其映射到的任何地方)。

有一个开放的设计方案可以让这更容易一些。请参阅Bond GitHub项目中的issue #594

除非出现这种情况,如果您希望为不同名称空间中的类型使用相同的转换器,您需要执行以下操作:

namespace Util
{
    public static class BondTypeAliasConverter
    {
        public decimal Convert(ArraySegment<byte> blob, decimal unused) { ... }
        public ArraySegment<byte> Convert(decimal d, ArraySegment<byte> unused) { ... }
    }
}

namespace First
{
    public static class BondTypeAliasConverter
    {
        public decimal Convert(ArraySegment<byte> blob, decimal unused)
        {
            return Util.BondTypeAliasConverter.Convert(blob, unused);
        }

        ....
    }
}

namespace First.Second
{
    public static class BondTypeAliasConverter
    {
        public decimal Convert(ArraySegment<byte> blob, decimal unused)
        {
            return Util.BondTypeAliasConverter.Convert(blob, unused);
        }

        ....
    }
}