来自子类的C#泛型类型参数可能吗?

Ste*_*fen 4 c# generics

我想标题并没有真正说明,所以这里是解释.

我有一个父类,我想要保存一个事件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:只是想让你知道反射,动态方法或类似的东西是一个选项,如果这有帮助.但是我怀疑这个特殊情况:-(

Ani*_*Ani 7

我不会真的推荐它,但你可以使用奇怪的重复模板模式的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)

在实践中,这将很难合理使用; 诚然,必须有更好的解决方案来整体设计.


Ste*_*fen 0

实际上我认为我找到了一个更好的方法:

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)

这对我来说似乎更干净,所以我将使用它。