繁体   English   中英

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

[英]C# generic type argument from child class, possible?

我想标题并没有说太多,所以这里是解释。

我有一个父类,我想举行一个事件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.
  }
}

所以问题是,以上可能吗?我将在Parent类中对T使用什么?

请注意,我不需要父类的通用参数,因为它看起来确实很愚蠢,因此妨碍了可读性。

class UserRecord : ActiveRecord<UserRecord>

我正在研究基于继承的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
    }
}

实际上,要明智地使用它会非常困难; 老实说,必须有一个更好的整体设计解决方案。

尝试这个:

abstract class Parent<T>
{
    public event Action<T> NewItem;
}

class Child : Parent<Child>
{
    public Child()
    {
        NewItem += OnNewItem;
    }

    private void OnNewItem(Child obj)
    {
        // Do something 
    }
} 

如果不能使Parentabstract ,可以在ParentChild之间添加一个抽象的过渡类。

class Parent<T>
{    
    public event Action<T> NewItem;
}

abstract class Transition<T> : Parent<T> { }

class Child : Transition<Child>
{
    public Child()
    {
        NewItem += OnNewItem;
    }
    private void OnNewItem(Child obj)
    {
        // Do something 
    }
} 

实际上,我认为我发现了一种更好的方法:

abstract class ActiveRecord
{
  protected virtual void OnNewItem() {}
}

class UserRecord : ActiveRecord
{

  protected override void OnNewItem()
  {
    // Still got the UserRecord object, now it's just "this"
  }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM