C#:有没有办法确保只能通过事件访问对象?

时间:2009-11-02 22:14:53

标签: c# events

有没有办法创建某种只允许通过事件访问对象的界面?

4 个答案:

答案 0 :(得分:15)

你不能只定义一个只包含事件的接口吗?

例如:

interface IExample
{
    event EventHandler Event1;
    event EventHandler Event2;
}

class Obj : IExample
{
    public event EventHandler Event1;
    public event EventHandler Event2;
}

用法:

IExample obj = new Obj();
obj.Event1 += Event1_Handler;
obj.Event2 += Event2_Handler;

答案 1 :(得分:2)

如果没有进一步的信息,我得到的最好答案就是你只需要确保所有的成员属性,函数等都被声明为私有,除了事件,这些都是公开的。

虽然我不得不承认,但我很难过这将如何有用,如果它只能被它的事件访问,会触发什么事件。这就像是说你可以创建一个你不能打电话的电话,但只能听到响铃(IncomingCall事件)。

答案 2 :(得分:1)

这样的设置只会使用程序集向客户端公开事件:

interface ISomething {
   event EventHandler MyEvent;
}

internal class MyClass : ISomething {
  ... 
}

public ClassFactory {
  public ISomething GetClass(){ // factory method
    return new MyClass();
  }
}

或者,如果您需要在自己的库中限制使用此类,您可以这样做:

public class MyClass : ISomething {
  private MyClass(){} // private constructor
  public ISomething  GetClass(){ // factory method
    return new MyClass();
  }
}

如果您只需要获取其事件,这样的事情可能会与单个对象结合使用,如果您只是想要一种通用的方式来订阅该对象的状态事件,这是有意义的。

答案 3 :(得分:0)

请注意,调用者可以访问的任何对象都可以包含任何字段accessed through reflection

如果您的问题集中在防止人们意外地错误地调用您的对象,那么Matt B.的答案很棒。

如果你的问题集中在让某人无法恶意访问你对象的私人字段,那是不可能的。