2009-10-24 2 views
2

Я хочу знать, есть ли какой-либо шаблон, который может решить эту проблему: У меня есть набор свойств, которые должны быть общедоступными для нескольких классов, а другим классам они должны быть только для чтения, классы должны быть общедоступными.Частично инкапсулировать поле C#

Я не хочу использовать отражение или любые другие плохие производители производительности.

Я знаю, что могу сделать их RO и реализовать логику внутри класса, но я не думаю, что это хорошо.

Любая помощь?

ответ

2

два варианта:

  1. сделать свойство внутреннего (а не класса) и групп классов в различные сборки.
  2. Использование отражения магии.

К сожалению, в C# нет классов friend.

8

Внутри сборки, вы можете сделать это internal.

Вне существующей сборки лучше всего сделать ее доступной для конкретных сборок, через [InternalsVisibleTo].

.NET не предлагает более подробный доступ «друг».

+4

Я думаю, что это следует рассматривать как анти-модель. –

+1

Я согласен с Йоханнесом. На самом деле, я думаю, что у вас есть проблема с дизайном, если вы хотите иметь различную доступность для разных абонентов. У .NET нет хороших друзей гранулата навсегда. –

+1

Очень действительные баллы; действительно, я обычно использую [InternalsVisibleTo] для модульных тестов. –

7
class Person : IReadOnlyPerson { 
    public string Name { get; set; } 
} 

public interface IReadOnlyPerson { 
    string Name { get; } 
} 

Для тех классов, которые должны сделать R/O доступ - использовать IReadOlyPerson

+0

Это хорошо. –

0

Вы могли бы попытаться объявить ваши сеттеры как защищенные в вашем базовом классе. Любой класс, который его выводит, сможет его установить. Но любой класс, использующий производный класс, будет видеть только свойство только для чтения.

public class ClassBase 
{ 
    public int MyProperty 
    { 
     get; 
     protected set; 
    } 
} 

public sealed class ClassDerived : ClassBase 
{ 
    public ClassDerived() 
    { 
     MyProperty = 4; // will set 
    } 
} 

public class ClassUsingDerived 
{ 
    public ClassUsingDerived() 
    { 
     ClassDerived drv = new ClassDerived(); 
     drv.MyProperty = 5; // will fail 
    } 
} 

То есть, если я понимаю вопрос правильно :)

+0

Это работает только в том случае, если рассматриваемый класс является производным. Что происходит, когда потребитель * не * производный? Я думаю, что это его настоящая проблема. –

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