2011-01-06 75 views
1

我有一个接口具有另一个接口的属性。无论如何,只要在使用中引用父接口,就会导出/提供/包含子接口。导出接口

//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 
} 

在elsewhere.cs,我不得不IFoo的一个参考,但希望能够访问伊巴尔的元素,而无需包括引用和using语句来伊巴尔。无论如何设置IFoo,只要它被引用/包含,它也带来IBAR一起乘坐?类似#include的方式直接运行C. 如果您说“复制并粘贴IBar到IFoo.cs”,我会忽略你。

我猜测,因为我从来没有看到任何可以做到这一点的东西,答案可能是你不能在C#中做到这一点。

编辑:的文件IBar.cs和IFoo.cs是在单独的组件
编辑:的接口是公开的,不是性能

回答

0

上面的代码应该没有任何修改或额外的“使用”语句添加。这是因为C#编译器将整个项目(即所有源文件)编译为一个大单元,而C(和C++)编译器则通过预处理器指令(如#include)来指示它们要包含哪些文件。

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

交通不便只能出现(在接口的情况下),当您不匹配的可见性修饰符,例如:

internal interface IFoo 
{ 
    void Stuff(); 
} 

public interface ISomething 
{ 
    IFoo GetFoo(); 
} 

在这种情况下,你会得到“可访问性不一致”的编译错误。

编辑如果otherwise.cs和IBar.cs在不同的程序集中,那么其中有别处.cs的程序集必须具有对包含IBar(和IFoo)的程序集的引用。没有办法自动化,但Visual Studio会警告你,如果你缺少任何引用(并且你的项目不能编译)。

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** 
     } 
    } 
} 

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

+0

对不起,我的意思是表明他们在不同的程序集以及不同的文件。 – 2011-01-06 19:48:22

1

这不是C#中的“可以做”或“不能做”的问题,它只是cookie崩溃的方式,并且没有任何错误。基本上,你只要引用该程序集并将该名称空间放入using子句中以访问IBar

什么特别让你有麻烦?如果您的问题只是编辑体验,请考虑使用类似ReSharper的工具。

0

不问你在C#中不能做什么。您只需添加两个使用语句。

最接近的机制,你想要什么,我还是不希望它的工作,是一个“using别名”,它看起来像这样:

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

一厢情愿的想法,但没有。