我正在使用表达式构建器模式来构建对象。表达式构建器在对象上配置的一件事是事件处理程序。这是一些示范性的伪代码:
public class TargetObject
{
public event Action SomeEvent;
}
public class ObjectBuilder
{
private Action handler;
public TargetObject GetObject()
{
TargetObject target = new TargetObject();
target.SomeEvent += handler;
return target;
}
public ObjectBuilder AddHandler(Action handler)
{
this.handler += handler;
return this;
}
}
我想要的是,而不是写:
this.handler += handler;
将ObjectBuilder中“handler”成员封装的调用列表传递给target中的“SomeEvent”。否则,ObjectBuilder将不会被垃圾收集,因为我的TargetObject的“SomeEvent”将保存对ObjectBuilder的“处理程序”的引用。
这可能吗?
编辑: 根据要求,这里有一些使用这些类的示例代码:
class Program
{
static void Main(string[] args)
{
TargetObject target = new ObjectBuilder()
.AddHandler(DoSomething)
.GetObject();
}
private static void DoSomething()
{
}
}
答案 0 :(得分:0)
你确定ObjectBuilder不是GC编辑的,因为TargetObject实例正在保持其“处理程序”字段吗? delegate是不可变的,this.handler + = handler将创建一个新的Action实例。