Как ссылаться на текущий тип класса, используя дженерики - PullRequest
16 голосов
/ 15 января 2010

У меня есть базовый класс с методом, в котором я хотел бы использовать обобщенные элементы, чтобы заставить кодировщика использовать обобщенное выражение для текущего класса:

public class TestClass
{
    public void DoStuffWithFuncRef<T>(Expression<Func<T, object>> expression) where T : TestClass
        {
            this.DoStuffWithFuncRef(Property<T>.NameFor(expression));
        }
}

Теперь я хотел бы, чтобы T относился к типу экземпляра класса, который, я надеюсь, заставит компилятор C # автоматически понять использование универсального типа. Например. Я хотел бы избежать кодирования метода 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 Ответ

19 голосов
/ 15 января 2010

Сделать базовый класс сам по себе универсальным:

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>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...