Экспортные интерфейсы - PullRequest
1 голос
/ 06 января 2011

У меня есть интерфейс, который имеет свойство другого интерфейса. Есть ли способ экспортировать / предоставлять / включать дочерний интерфейс всякий раз, когда на родительский интерфейс ссылаются при использовании.

//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, но я хотел бы иметь возможность доступа к элементам IBar без необходимости включать ссылки и оператор использования в IBar. Есть ли способ настроить IFoo так, чтобы всякий раз, когда на него ссылались / включали, он также приносил с собой IBar для поездки? Что-то вроде того, как #include s работает в прямом C. Если вы скажете «Скопируйте и вставьте IBar в IFoo.cs», я вас проигнорирую.

Я предполагаю, что, поскольку я никогда не видел ничего, что могло бы сделать это, ответ, вероятно, заключается в том, что вы не можете сделать это в C #.

РЕДАКТИРОВАТЬ: Файлы IBar.cs и IFoo.cs находятся в отдельных сборках
РЕДАКТИРОВАТЬ: Интерфейсы общедоступны, а не свойства

Ответы [ 4 ]

1 голос
/ 06 января 2011

Это не вопрос «могу сделать» или «не могу сделать» в C #, это просто способ, которым печенье рушится, и в этом нет ничего плохого.По сути, вы просто имеете для ссылки на эту сборку и помещаете это пространство имен в предложения using для доступа к IBar.

Что, в частности, вызывает у вас проблемы?Если ваша проблема заключается только в редактировании, попробуйте использовать такой инструмент, как ReSharper .

1 голос
/ 06 января 2011
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 голосов
/ 06 января 2011

Нет, то, что вы просите, не может быть сделано в C #.Вы просто должны добавить оба выражения using.

Самый близкий механизм к тому, что вы хотите, и я все еще не ожидаю, что он сработает, - это использование псевдонима, которое выглядит следующим образом:

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

Желаемое за действительное, но нет.

0 голосов
/ 06 января 2011

Ваш код должен работать без каких-либо модификаций или дополнительных операторов "using". Это связано с тем, что компилятор C # компилирует весь проект (то есть все исходные файлы) как один большой модуль, тогда как компиляторы C (и C ++) получают инструкции директив препроцессора (например, #include), чтобы сообщить им, какие файлы включать.

Кстати, члены в объявлениях интерфейса неявно являются публичными, поэтому ваши «публичные» модификаторы там избыточны (я думаю, что это также дает вам ошибку компилятора). Возможно, это вас смущает?

Недоступность может возникнуть (в случае интерфейсов), только если вы не соответствуете модификаторам видимости, например:

internal interface IFoo
{
     void Stuff();
}

public interface ISomething
{
     IFoo GetFoo();
}

В этом случае вы получите ошибку компилятора «Несогласованная доступность».

Редактировать : если elsewhere.cs и IBar.cs находятся в разных сборках, сборка, в которой есть elsewhere.cs, должна иметь ссылку на сборку, содержащую IBar (и IFoo). Нет никакого способа автоматизировать это, хотя Visual Studio предупредит вас, если вы пропустите какие-либо ссылки (и ваш проект не будет компилироваться).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...