Как ссылаться на текущий тип класса с использованием дженериков
У меня есть базовый класс с методом, где я хотел бы использовать generics, чтобы заставить кодера использовать общее выражение для текущего класса:
public class TestClass
{
public void DoStuffWithFuncRef<T>(Expression<Func<T, object>> expression) where T : TestClass
{
this.DoStuffWithFuncRef(Property<T>.NameFor(expression));
}
}
Теперь я хотел бы заставить T быть типом инстанцированного класса, который, я надеюсь, заставит компилятор С# автоматически понять используемый универсальный тип. Например. Я хотел бы избежать кодирования метода doStuff ниже, где я должен указать правильный тип, но скорее использовать метод doStuffILikeButCannotGetToWork:
public class SubTestClass : TestClass
{
public string AProperty { get; set; }
public void doStuff()
{
this.DoStuffWithFuncRef<SubTestClass>(e => e.AProperty);
}
public void doStuffILikeButCannotGetToWork()
{
this.DoStuffWithFuncRef(e => e.AProperty);
}
}
Возможно ли это? Должен ли я делать это по-другому?
Ответы
Ответ 1
Сделать базовый класс сам по себе общим:
public class TestClass<T> where T : TestClass<T>
{
public void DoStuffWithFuncRef(Expression<Func<T, object>> expression)
{
this.DoStuffWithFuncRef(Property<T>.NameFor(expression));
}
}
и вытекает из него:
public class SubTestClass : TestClass<SubTestClass> {
// ...
}
Если вам нужна иерархия наследования с одним корнем, наследуйте базовый базовый класс из другой не-общей версии:
public class TestClass { ... }
public class TestClass<T> : TestClass where T : TestClass<T>
Конечно, вы должны, вероятно, сделать абстрактные базовые классы.