![](/img/trans.png)
[英]In C# 4.0, is it possible to derive a class from a generic type parameter?
[英]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
}
}
如果不能使Parent
是abstract
,可以在Parent
和Child
之间添加一个抽象的过渡类。
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.