在C#中实现(POCO)struct属性访问器

我想在C#中使用我的C/C++LI dll实现一个接口.但我猜C中的返回值优化问题.考虑

// BVHTree.cpp:
public value struct Vector3
{
    float X, Y, Z;
};

public value struct TriangleWithNormal
{
    Vector3 A, B, C, Normal;
};

public interface class IBVHNode
{
    property TriangleWithNormal Triangle { TriangleWithNormal get(); } // among others
    property bool IsLeaf { bool get(); } // can implement this
};
// BVHNode.cs:
public class BVHNode : IBVHNode // Error: member TriangleWithNormal* IBVHNode.get_Triangle(TriangleWithNormal*) not implemented (sth. along those lines)
{
    public TriangleWithNormal Triangle { get { return new TriangleWithNormal(); } }
    public bool IsLeaf { get { return true; } }
}

它抱怨BVNode没有实施IBVHNode.我的最后一招是通过常规方法或使用像visual studio建议的不安全模式访问它:

public TriangleWithNormal* get_Triangle(TriangleWithNormal* t) 
{ 
    throw new NotImplementedException();
}

有没有办法在属性语法中实现它(除了使TriangleWithNormal成为一个ref类…)?

更新1似乎是实现方法TriangleWithNormal GetTriangle()失败的原因相同.但是你可以像void GetTriangle(TriangleWithNormal%);那样使用它.

最佳答案 一旦我修复了一些次要的语法错误(在C/C++LI中的类声明后,缺少单词bool作为IsLeaf.get()的返回类型),你的代码对我有用,并定义了Vector3类型.

我猜到你如何定义Vector3,它不是我熟悉的标准类.它在哪里定义?它是托管类,托管结构还是非托管? (我把它定义为公共值struct Vector3 {double x,y,z;};用于我的测试.)

正如我所说,您在此处发布的C/C++LI代码中存在轻微的语法错误.这两个错误给出了非常明显的编译错误,所以我假设这些是从Visual Studio到Web的转录中的拼写错误.您发布的内容与实际代码之间是否有任何其他变化?

另外,我无法获得您报告的错误消息,成员TriangleWithNormal * IBVHNode.get_Triangle(TriangleWithNormal *)未实现.我总是遇到编译错误错误CS0535:’CSharpTest.BVHNode’没有实现接口成员’CppCLITest.IBVHNode.Triangle’.

您显示的属性不带参数,但编译器错误显示get_Triangle方法,该方法采用TriangleWithNormal *类型的参数.您是否在某个地方有另一个属性声明,或明确声明该方法?

我想我可以拥有它.如果我尝试将C/C++LI属性声明为索引属性,那么我会得到类似于您所看到的方法签名.

在你的实际代码中,你有这样的东西:

property TriangleWithNormal Triangle[TriangleWithNormal] { TriangleWithNormal get(TriangleWithNormal input); }

这是一个索引属性,C#不允许您实现. (C#允许一个索引属性,这个[],但只允许那个.)

当我尝试在C#中实现它时,它需要我显式实现属性的支持方法,而不是将其实现为C#属性.

public TriangleWithNormal get_Triangle(TriangleWithNormal input)
{
    return new TriangleWithNormal();
}

使索引属性成为常规属性,这应该适合您.

点赞