C# 不同类对属性的不同访问

C# 不同类对属性的不同访问,c#,access-modifiers,C#,Access Modifiers,我有一个基本(抽象)类组件。我想控制对派生类属性的访问,这样每个人都可以获得读访问权,但写访问权只能由某些类允许 这些“特定类”当前是实现抽象基类的任何东西MessageHandler。理想情况下,我还希望实现IMessageHandler的类能够获得访问权限,但我认为这会使要求更加严格 这将在xbox上运行,因此我希望避免创建临时对象(例如只读副本)。我还希望尽量减少方法调用的数量,以获得读/写到的值 组件类和MessageHandler类当前位于它们自己的程序集中,这两个类在使用my API

我有一个基本(抽象)类
组件
。我想控制对派生类属性的访问,这样每个人都可以获得读访问权,但写访问权只能由某些类允许

这些“特定类”当前是实现抽象基类的任何东西
MessageHandler
。理想情况下,我还希望实现
IMessageHandler
的类能够获得访问权限,但我认为这会使要求更加严格

这将在xbox上运行,因此我希望避免创建临时对象(例如只读副本)。我还希望尽量减少方法调用的数量,以获得读/写到的值

组件
类和
MessageHandler
类当前位于它们自己的程序集中,这两个类在使用my API时都将被其他项目引用

我猜我将不得不以某种方式改变我的模型,但我无法改变我的想法

public abstract class Component
{

}

public class DerivedComponentA : Component
{
    int property {get; set;}
}

public abstract class MessageHandler<TMessage>
{

}

public class IntMsghandler : MessageHandler<int>
{
    void DoThing(DerivedComponentA derivedComponentA)
    {
        derivedComponentA.property = 5; // Allowed
    }
}

public class AnyClass // Doesn't inherit MessageHandler, or implement IMessageHandler
{
    void DoThing(DerivedComponentA derivedComponentA)
    {
        derivedComponentA.property = 5; // Not Allowed
    }
}
公共抽象类组件
{
}
公共类派生组件A:组件
{
int属性{get;set;}
}
公共抽象类MessageHandler
{
}
公共类IntMsghandler:MessageHandler
{
无效点滴(DerivedComponentA DerivedComponentA)
{
derivedComponentA.property=5;//允许
}
}
公共类AnyClass//不继承MessageHandler,也不实现IMessageHandler
{
无效点滴(DerivedComponentA DerivedComponentA)
{
derivedComponentA.property=5;//不允许
}
}

您不能像这样控制设定器:

public string Prop {
  get { return ...; }
  set { if (!(this is MessageHandler<TMessage>)) 
           throw Exception(...);
        .... setter code;
  }
}
公共字符串属性{
获取{return…;}
设置{if(!(这是MessageHandler))
抛出异常(…);
..设定器代码;
}
}

我建议您在这里使用接口。具有一个只读接口
IReadOnlyComponent
,该接口具有只读属性和一个
IWritableComponent:IReadOnlyComponent
,该接口为属性添加一个
Set
方法。
抽象基类
Component
实现
IWritableComponent
,因此具有只读属性和
Set
方法。
仅将组件实例作为
IWritableComponent
传递给继承自
MessageHandler
或实现
IMessageHandler
的类,并将其作为
IReadOnlyComponent
传递给所有其他类。

隔离(基于您提出的问题和我理解的内容)是基于基类定义进行的(如果有的话)。这意味着隔离应该从它开始

或者,如果你说,如果一些
classx
实现
MessageHandler
应该能够以多种方式对
classy
类型对象进行操作。我认为,这意味着
Y类
MessageHandler

这让我觉得你可以做这样的事情:

  • 只有public
    get
    才能获取
    DerivedComponentA
  • MessageHandler
    中定义一个通用的
    受保护的SetProperty(组件compo、字符串propertyName、对象propertyValue)
    并使用反射设置所需的属性
通过这种方式,在任何
组件
派生类上设置属性的唯一可能方法是使用
MessageHandler
方法,因此仅对从该方法派生的类可用。对于其余可用类型,您仅提供用于读取数据的
公共获取
(只读)权限


希望这能有所帮助。

如果有什么不清楚的地方,请告诉我,我会编辑。您想限制访问的内容还不清楚。您想限制访问的属性在哪里?@Matten:这是非法的。您不能更改被覆盖成员的访问修饰符。您想要的似乎一开始就不是继承。对不起,我很抱歉我可能不清楚,属性在组件类上,而不是消息处理程序(尽管消息处理程序是要更改值的处理程序)。添加了代码。此外,理想情况下,我希望在编译时强制执行它(尽管不知道这有多现实)。