Нет, это невозможно, если только T
не ограничен в качестве интерфейса или класса со всеми виртуальными членами, и это ограничение невозможно указать во время компиляции (хотя вы могли бы написать среду выполнения проверьте, довольны ли вы этим подходом).
Причина, по которой вы не можете сделать это для произвольных типов, заключается в том, что если вы берете объект типа T
, вы должны вернуть объект, который может быть назначен на T
. Если я передам объект, который выглядит следующим образом ...
public sealed class SomeClass : INameable
{
public string Name { get; }
public string Abc { get; }
}
... тогда вы не сможете создать другой тип, который можно назначить на SomeClass
. Не используется Reflection.Emit
или любой другой метод, потому что тип запечатан.
Однако, если вы удовлетворены упомянутыми мною ограничениями, вы можете использовать что-то вроде инфраструктуры Castle DynamicProxy для создания типа, который проксирует переданный объект и перехватывает вызовы для пересылки или повторной реализации как необходимо.