Возможно, вы могли бы сделать это с отражением. Но какова ваша цель? Чтобы украсить класс, или создать инструменты, которые делают вещи с ним? Расширение существующего экземпляра класса так, как вы хотите, кажется рискованным, потому что вы не будете создавать новый экземпляр базового класса, а код, который использует объект, не будет знать об этом. То есть свойства могут изменить либо просто новый объект, либо какой-либо другой объект, который он расширяет, и точная функциональность будет неизвестна из синтаксиса.
Я бы подумал, что гораздо прозрачнее (в общем) просто сделать, например
class Wrapper<G> where G: SomeType
{
public G Base;
public Wrapper(G g) {
Base = g;
}
// methods to do stuff with object supplied at construction
}
Вы могли бы сделать это без where
, но я не могу придумать многих причин, по которым вам было бы все равно, какой это базовый тип.
Если вы действительно хотите создать новый класс, который имеет новые свойства и наследует данные от существующего класса, я думаю, что вы, возможно, слишком стараетесь, потому что это не имеет смысла: два объекта не будут дольше связаны разумным способом. То есть изменения в свойствах базового класса могут повлиять на объект, отличный от изменений в свойствах вашего расширения. Это именно то, что произошло бы, если бы в этом примере у вас были свойства в MyWrapper.Base, но более концептуально более разумно поддерживать ссылку на объект отдельно от базы, если это на самом деле ваша цель. В противном случае клиенты, использующие ваш объект расширения, не поняли бы этого, и вы легко могли бы в конечном итоге не знать, почему ваш код работал неправильно ...
Если вы хотите создать новый объект, который расширяет что-то и копирует свойства существующего объекта некоторым прозрачным способом, то сделайте что-то вроде этого:
class Wrapper<G>: G
{
public Wrapper(G g) {
// add memberwise copy function
}
.. more properties
}
Wrapper<SomeType> newWrapper = Wrapper<SomeType>(someOtherObject);
.. как то, как вы можете создать новый список из существующего.