我正在使用 WinForms 选项卡式 MDI 界面在 C# 中开发 LOB 应用程序。我有各种带有 DataGridViews 的表单,允许用户选择他们感兴趣的对象,然后他们可以在新表单中查看/编辑。
我的每个主要业务对象都继承自 Entity,其定义如下:
public abstract class Entity
{
public static event Action Saved;
internal virtual void OnSaved()
{
if (Saved != null)
{
Saved();
}
}
}
然后我有填充网格的对象(这些实际上是从 Linq-to-SQL 自动生成的类,尽管我可以用普通类复制问题):
class Class1 : Entity
{
//Stuff
}
class Class2 : Entity
{
//Stuff
}
我想知道给定类的对象何时被修改,但我不在乎哪个实例(因此是静态操作),以便我可以刷新网格并执行其他活动。
当事件从派生类实例触发时,问题就出现了——它也会为所有其他派生类触发。例如:
Class1.Saved += new Action(s1);
Class2.Saved += new Action(s2);
private void TestIt()
{
Class2 o2 = new Class2();
o2.OnSaved();
}
这将触发 s1 和 s2,但我只希望触发特定的(即 s2)。做这个的最好方式是什么?我有很多类需要这种行为,并且希望尽可能避免向每个类添加任何代码。
更新:
感谢您的所有回复,他们非常有帮助。
我选择了一个稍微不同的选项,我承认这看起来很老套,但很适合我的目的。这涉及通过操作传递类型并让处理程序过滤并调用相关操作。
实体类:
public abstract class Entity
{
public static event Action<Type> Saved;
internal void OnSaved()
{
private Action<Type> SavedCopy = Saved;
if (SavedCopy != null)
SavedCopy(this.GetType());
}
}
挂钩处理程序:
Entity.Saved += new Action<Type>(Handler);
示例处理程序方法(这将因表单而异):
void Handler(Type obj)
{
if (obj==typeof(Class1))
UpdateGrid();
else if (obj==typeof(Class2))
UpdateBasicInfo();
else if (obj == typeof(Class3))
DoAnotherThing();
}