【问题标题】:Export interfaces导出接口
【发布时间】:2011-01-06 18:55:42
【问题描述】:

我有一个具有另一个接口属性的接口。每当在使用中引用父接口时,是否有导出/提供/包含子接口的方法。

//IBar.cs
namespace bar
{
    interface IBar
    {
        public int BarProp { get; set; }
    }
}

//IFoo.cs
namespace foo
{
    using bar
    interface IFoo
    {
        public IBar FooProp { get; set; }
    }
}

//elsewhere.cs
namespace foo
{
    //using bar //without this, 
    IFoo myFoo = new SomeClassThatImplementsIFoo();
    myFoo.FooProp.BarProp //<-- BarProp is inaccessable here
}

在 else.cs 中,我有对 IFoo 的引用,但希望能够访问 IBar 的元素,而不必包含对 IBar 的引用和 using 语句。无论如何设置 IFoo 以便每当它被引用/包含时,它也会带来 IBar 吗?类似于#includes 在直接 C 中的工作方式。 如果你说“将 IBar 复制并粘贴到 IFoo.cs 中”,我会忽略你。

我猜是因为我从未见过任何可以做到这一点的东西,答案可能是你不能在 C# 中做到这一点。

编辑:文件 IBar.cs 和 IFoo.cs 位于单独的程序集中
编辑:接口是公共的,而不是属性

【问题讨论】:

    标签: c# interface reference


    【解决方案1】:
    namespace bar
    {
        interface IBar
        {
            public int BarProp { get; set; }
        }
    }
    
    //IFoo.cs
    namespace foo
    {
        using bar;
        interface IFoo
        {
            public IBar FooProp { get; set; }
        }
    }
    
    //elsewhere.cs
    namespace foo
    {
    
        class test: IFoo {
    
            public test (){
        //using bar //without this, 
        IFoo myFoo = new test();
        int val = myFoo.FooProp.BarProp; //<-- **BarProp is not inaccessable here**
            }
        }
    }
    

    可以使用命名空间而不是文件来访问类型。

    【讨论】:

    • 对不起,我的意思是他们在不同的程序集和不同的文件中。
    【解决方案2】:

    这不是 C# 中“能做”或“不能做”的问题,这只是 cookie 崩溃的方式,没有任何问题。基本上,您只需必须引用该程序集并将该命名空间放入using 子句以访问IBar

    特别是什么让您感到烦恼?如果您的问题只是编辑体验,请考虑使用ReSharper 之类的工具。

    【讨论】:

      【解决方案3】:

      您的上述代码无需任何修改或添加额外的“使用”语句即可工作。这是因为 C# 编译器将整个项目(即所有源文件)编译为一个大单元,而 C(和 C++)编译器由预处理器指令(如#include)指示,告诉它们要包含哪些文件。

      顺便说一句,接口声明中的成员是隐式公共的,所以你的“公共”修饰符至少是多余的(我认为它也会给你一个编译器错误)。也许这就是让你感到困惑的地方?

      只有当您不匹配可见性修饰符时,才会出现无法访问(在接口的情况下),例如:

      internal interface IFoo
      {
           void Stuff();
      }
      
      public interface ISomething
      {
           IFoo GetFoo();
      }
      

      在这种情况下,您将收到“不一致的可访问性”的编译器错误。

      编辑:如果 else.cs 和 IBar.cs 位于不同的程序集中,则包含 else.cs 的程序集必须具有对包含 IBar(和 IFoo)的程序集的引用。无法自动执行此操作,但如果您缺少任何引用,Visual Studio 会警告您(并且您的项目将无法编译)。

      【讨论】:

        【解决方案4】:

        不,您所要求的不能在 C# 中完成。您只需添加两个 using 语句。

        与您想要的最接近但我仍然不希望它起作用的机制是“使用别名”,它看起来像这样:

        using BarProp = bar.IBar.BarProp; //nice try, but not legal
        

        一厢情愿,但没有。

        【讨论】:

          猜你喜欢
          • 2015-08-23
          • 1970-01-01
          • 1970-01-01
          • 2017-09-09
          • 2016-12-26
          • 2017-04-12
          • 2017-05-31
          • 2020-03-06
          • 2018-06-23
          相关资源
          最近更新 更多