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

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

这将在 xbox 上运行,因此我想避免创建临时对象(例如只读副本)。我还想最大限度地减少方法调用的次数,以获取读取/写入的值。
Component 类和 MessageHandler<TMessage> 类目前在它们自己的程序集中,这两个类在使用我的 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
    }
}

最佳答案

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

或者,如果您说,如果某些 class X 实现 MessageHandler 应该能够以多种方式对 class Y 类型对象进行操作。 imo,这意味着两者之间存在着艰难的关系class YMessageHandler

这导致我认为你可以做这样的事情:

  • 仅在 get
  • 的属性上公开 DerivedComponentAMessageHandler 中的
  • 定义了一个通用的 protected SetProperty(Component compo, string propertyName, object propertyValue) 并使用反射设置所需的属性。

  • 通过这种方式,在任何 Component 派生类上设置属性的唯一可能方法是使用 MessageHandler 方法,因此仅适用于从它派生的那些人。对于其余可用类型,您仅提供 public get (readonly) poperty 来读取数据。

    希望这可以帮助。

    关于c# - 不同类对属性的不同访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8986370/

    10-10 22:56