Ограничить параметр метода экземпляра типом экземпляра - PullRequest
0 голосов
/ 20 октября 2011

Скажем, у меня есть абстрактный базовый класс BaseClass.

Я хотел бы дать ему метод, который выглядит примерно так:

public void CopyPropertiesFrom<T>(T source) where T == ThisDerivedClass : BaseClass
{
     // ...
}

Я хочу, чтобы метод былуниверсальный, но должен быть ограничен самым производным классом текущего экземпляра.(Мой метод будет использовать отражение, поэтому мне не нужно переопределять CopyPropertiesFrom в любых дочерних классах, но мне все равно хотелось бы безопасность типов во время компиляции.)

Есть ли способ выразить этов действительном C #?

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Мало того, что это невозможно выразить, но и компилятор в любом случае не сможет применить его.Суть обобщений в том, что они могут быть проверены во время compile .Что бы вы ожидали от этого ...

BaseClass foo = new DerivedClass();
foo.CopyPropertiesFrom<BaseClass>(new OtherDerivedClass());

Компилятору известно только о foo как BaseClass - откуда ему знать, чтобы жаловаться, что на самом деле , вам следуетвызов foo.CopyPropertiesFrom<DerivedClass>?

Конечно, вы можете проверить метод - но я не уверен, что я бы даже сделал его общим:

public void CopyPropertiesFrom(BaseClass other)
{
    if (other.GetClass() != GetClass())
    {
        throw new ArgumentException("...");
    }
}
1 голос
/ 20 октября 2011

Нет, нет.Вы можете разрешить только класс и любой производный (независимо от глубины наследования).

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