C# 允许两个项目从同一债券继承

C# 允许两个项目从同一债券继承,c#,inheritance,bond,C#,Inheritance,Bond,在C#项目中使用 假设我在一个项目a'中使用了一个绑定文件a',并且希望有两个项目B'和C'具有绑定文件B和C,这两个项目都具有从文件a中的结构继承的结构。我将如何做到这一点 我曾考虑创建一个ProjectReference,但它似乎只提供从这些绑定文件生成的C#类,不允许我从原始绑定文件进行绑定继承,因此我在一个项目与另一个项目之间建立了链接。不幸的是,我当前的解决方案非常容易出错,在一个项目中更改该文件位置也会破坏另一个项目 建议的方法是什么?要使绑定文件B和C继承或包含绑定文件A(在项目A

在C#项目中使用

假设我在一个项目a'中使用了一个绑定文件a',并且希望有两个项目B'和C'具有绑定文件B和C,这两个项目都具有从文件a中的结构继承的结构。我将如何做到这一点

我曾考虑创建一个ProjectReference,但它似乎只提供从这些绑定文件生成的C#类,不允许我从原始绑定文件进行绑定继承,因此我在一个项目与另一个项目之间建立了链接。不幸的是,我当前的解决方案非常容易出错,在一个项目中更改该文件位置也会破坏另一个项目


建议的方法是什么?

要使绑定文件B和C继承或包含绑定文件A(在项目A')中的类型,您需要在B和C的顶部导入绑定文件A。这使A中的类型在B和C中已知

a、 债券 b、 债券 对于导入路径,您有三个选项:

  • 使用完全限定的路径,如
    import“C:/src/projectAPrime/schemas/a.bond”
  • 使用相对路径,如导入“./../projectAPrime/schemas/a.bond”
  • 使用类似于
    import“a.bond”
    import“schemas/a.bond”的相对路径,并添加到bond导入路径:在消费项目的其他地方,您可以确保使用项目a的搜索目录扩充了
    BondImportDirectory`项
  • 我不推荐第一个选项,因为它将路径绑定到一台特定机器的布局。在实践中使用选项2或3的混合物

    对于方法三,消费项目通常直接在其中或通过导入的其他MSBuild文件具有类似的内容

    <ItemGroup>
      <BondImportDirectory Include="$(ProjectAPrimeRoot)" />
      <!-- or some other reference to project A, depending
           on how your projects are structured (perhaps you
           have a all_projects.props file for these sort of
           variables or item modifications -->
    </ItemGroup>
    
    
    
    我不能给您比这更具体的指导,因为我不知道您的特定项目结构,而且MSBuild无法让项目“导出”引用项目自动获得的值(我知道)

    请注意,您仍然需要项目a'的ProjectReference,因为在项目B'和C'中生成的代码将依赖于项目a'生成的程序集中生成和编译的代码

    有关使用
    BondImportDirectory导入的工作示例,请参阅Bond存储库中的。但是,这并不能解决跨项目导入问题,因此您需要根据自己的情况进行调整


    如果您是C++开发人员,这应该与<>代码>包含< <代码>路径> < /p>,所以实际问题在于这些项目之间如何使用这些绑定定义,而不是由它们生成的代码?@雷内-是的,问题是项目引用不允许bond编译器使用来自被引用项目的bond(至少,不是我使用它的方式),谢谢!只是要确保,答案是正确的任何进口一个债券从另一个,而不仅仅是继承,对吗?(例如,包含bond B类型字段的bond A)合成的工作方式相同。答案已经更新。

    import "a.bond"
    
    namespace B;
    
    struct Derived : A.Base { } 
    
    struct Composition {
        // notice fully qualified name is used for Base
        0: A.Base has_a_base;
    }
    
    <ItemGroup>
      <BondImportDirectory Include="$(ProjectAPrimeRoot)" />
      <!-- or some other reference to project A, depending
           on how your projects are structured (perhaps you
           have a all_projects.props file for these sort of
           variables or item modifications -->
    </ItemGroup>