2010-02-16 1 views
2

Этот вопрос похож на этот: Restrict method access to a specific class in C++Создание ограниченных методов/полей в C#

Однако, мой вопрос для C#.

Повторим: у меня есть два класса, скажем Foo и Bar, которые плотно связаны. Foo предоставляет метод, который мне нужен только Bar.

У меня есть представление о том, чего я хочу, но не знаю, как на самом деле это сделать, или знать, существует ли более простой способ. Это предполагает использование какого-то атрибута, который полагается на использование (new StackFrame(1)).GetMethod().DeclaringType, чтобы запретить доступ. Использование будет выглядеть примерно так:

public class Foo { 

    [RestrictedUsage(Allow=typeof(Bar))] 
    public int SomeMethod() 
    { 
     // do something 
    } 

} 

Есть, вероятно, соответствующие детали я пропавшими без вести на вопрос (я здесь новый) - Я буду уверен, чтобы обновить его, как я иду.

UPDATE: Следует отметить, что Foo оборачивает существующий UIElement кто поведение я пытаюсь изменить. Поскольку класс запечатан, его трудно изменить в обычном режиме. Bar - это класс, который преобразует значения в правильные значения. Bar не является пользовательским интерфейсом и используется в других местах моего приложения. Foo не знает, как преобразовать значение (это сложно - вот что такое Bar), и поэтому я не могу просто обернуть базовый метод.

Jon Skeet дал ответ, который я ожидал, - измените расположение классов (все спасибо ему до сих пор), но я не думаю, что любой ответ применим (хорошие ответы просто не актуальны).

Я уже делал ошибки в коде, ссылаясь на неправильное свойство ...

ответ

6

Два варианта:

  • Положите Foo и Bar в отдельной сборке, и сделать метод Foo внутренние
  • сделать Бар вложенного класса в Foo, и сделать метод частного

Последнее, как правило, более практичным вариантом, если это целесообразно сделать Bar вложенную CLAS s.

Если ни одна из этих функций не работает, я думаю, что вам лучше всего использовать внутренний метод и документировать его - насколько вы недоверяете остальной части кода в сборке?

+0

Я недоверяю код, потому что я не единственный, кто его использует , Так как Foo также является UIElement, он, естественно, также упоминается в другом месте (исключая отдельную сборку). –

+0

Не единственное, кто использует это, не обязательно является причиной для недоверия коду. Регулярно ли ваши коллеги игнорируют задокументированные предупреждения «не используйте этот тип»? Кроме того, только потому, что Foo упоминается в другом месте, это не значит, что он не может быть в своей собственной сборке ... –

+0

В итоге я занял класс. Я немного изменил некоторые другие части, и новый результат велик. Благодаря! –

0

Обычно я хотел бы предложить что-то вроде следующего:

public abstract class Foo:UIElement{ 
    //... 
} 

public class Bar:UIElement{ 
    //... 
    private class FooImpl:Foo 
    { 
     public int SomeMethod() 
     { 
      // do something 
     } 
    } 
} 

Но если мы имеем дело с UiElements, то мы, вероятно, также имеем дело с XAML? Структура класса, подобная этой, затруднит создание Foo/FooImpl в XAML, поскольку вам, вероятно, понадобится использовать шаблон фабрики ...

Смежные вопросы