我想标题并没有真正说明,所以这里是解释.
我有一个父类,我想要保存一个事件Action,其中T是子类继承它的类型.
例如:
abstract class ActiveRecord
{
protected event Action<T> NewItem;
}
class UserRecord : ActiveRecord
{
public UserRecord()
{
NewItem += OnNewItem; // NewItem would in this case be Action<UserRecord>
}
private void OnNewItem(UserRecord obj)
{
// Flush cache of all users, since there's a new user in the DB.
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是,以上是否可能,以及在Parent类中我将使用什么?
请注意,我不希望我的父类有一个泛型参数,因为它真的看起来很愚蠢,因而妨碍了可读性.
class UserRecord : ActiveRecord<UserRecord>
Run Code Online (Sandbox Code Playgroud)
我正在研究基于继承的ORM,以防你想知道它是什么.只要ORM将数据插入数据库,就会引发NewItem事件.
编辑:尝试通过正确命名类来更好地阐明.
ActiveRecord类驻留在一个单独的程序集中,UserRecord驻留在我正在处理的Web项目中.(注意:我是两个部分的开发者,但它是两个独立的项目)
我希望能够在成功插入行,删除行等时引发事件.事件应该将有问题的记录作为参数传递给事件处理程序,因此需要Action.
但是,当我在基类(ActiveRecord)中声明这些事件时,我需要一些方法将CHILD类型传递给事件处理程序,以获得强类型对象.
我可以,当然去动作,然后做一个类型转换在我的实现,但真的不会是非常好的:-(
希望这能解决一下这个问题,否则请问:-)
编辑2:只是想让你知道反射,动态方法或类似的东西是一个选项,如果这有帮助.但是我怀疑这个特殊情况:-(
我不会真的推荐它,但你可以使用奇怪的重复模板模式的C#版本:
class Parent<T> where T : Parent<T>
{
protected event Action<T> NewItem;
}
class Child : Parent<Child>
{
public Child()
{
NewItem += OnNewItem;
}
private void OnNewItem(Child obj)
{
// Do something
}
}
Run Code Online (Sandbox Code Playgroud)
在实践中,这将很难合理使用; 诚然,必须有更好的解决方案来整体设计.
实际上我认为我找到了一个更好的方法:
abstract class ActiveRecord
{
protected virtual void OnNewItem() {}
}
class UserRecord : ActiveRecord
{
protected override void OnNewItem()
{
// Still got the UserRecord object, now it's just "this"
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎更干净,所以我将使用它。