Is it possible to use the generic Wrapper class?
In C # 3.0 and .NET 3.5, imagine an interface:
public interface INameable
{
string Name {get;}
}
and many immutable classes that implement the interface.
I would like to have one extension method
public static T Rename<T>(this T obj) where T : INameable
{
...
}
which returns a wrapped instance of the original object with only the changed name, and all other property reads and method calls are redirected to the original object.
How do I get a generic wrapper class for this without applying it across all INameable implementation types? Do you think this is possible?
source to share
No, this is not possible, unless T
it is an interface or a class with all members virtual, and this constraint cannot be specified at compile time (although you could write a runtime check if you are happy with this approach).
The reason you cannot do this for arbitrary types is that if you take an object of the type T
, then you must return an assignable object T
. If I pass in an object that looks like this ...
public sealed class SomeClass : INameable
{
public string Name { get; }
public string Abc { get; }
}
... then you can not create another type that can be assigned SomeClass
. Do not use Reflection.Emit
any other method, as the type is sealed.
However, if you're happy with the constraints I mentioned, you can use something like the DynamicProxy framework to create a type that proxies the passed object and intercepts calls for either forwarding or reimplementation as needed.
source to share
Well, yes, it is possible, but it has to do with in-memory code generation.
You can see Reflection.Emit and here .
Please note that it will contain a lot of code.
That is, if I believe I understand you correctly.
Here's what I think you are asking:
SomeNameableObject a1 = new SomeNameableObject("ThisIsTheFirstName");
SomeNameableObject a2 = a1.Rename("ThisIsTheSecondName");
// a1 works, still has the name ThisIsTheFirstName
// a2 works, but everything is routed to a1,
// except for the name, which is ThisIsTheSecondName
Is it correct?
source to share