有没有办法创建某种只允许通过事件访问对象的界面?
答案 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.的答案很棒。
如果你的问题集中在让某人无法恶意访问你对象的私人字段,那是不可能的。