Как ссылаться на текущий тип класса с использованием дженериков

У меня есть базовый класс с методом, где я хотел бы использовать 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>

Конечно, вы должны, вероятно, сделать абстрактные базовые классы.