Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to add a method to an EXISTING class at runtime? why or why not?

I would imagine this might use Reflection.Emit,

but a similar question on SO only answers how to create a class/method dynamically, not how to update an existing class.

In a similar vein, is it possible to delete methods / classes at runtime? If so, I suppose one could just delete the class, and add it back with its old methods plus the new one.

Thanks in advance.

P.S. I don't have an intended use for this, it is merely a matter of curiosity.

like image 502
user420667 Avatar asked Jun 22 '12 18:06

user420667


People also ask

Can we create a class at runtime?

In the preceding code ClassName is a variable, that contains the class name to be created. This class helps to create a dynamic assembly at run time. This is a sealed class and has no constructor. The object of this class is created using the DefineDynamicAssembly method of the AppDomain class.

Which means attaching a message to a method at run time?

Connecting a method call to the method body is known as binding. Static Binding (also known as Early Binding).


1 Answers

In regular C# / .NET, the answer is a simple "no". The most you can do is write a DynamicMethod which can behave like a method of that type (access to private fields etc), but it won't ever be on the API - you just end up with a delegate.

If you use dynamic, you can do pretty much anything you want. You can emulate that with ExpandoObject by attaching delegates in place of methods, but on a custom dynamic type you can do most anything - but this only impacts callers who use the dynamic API. For a basic ExpandoObject example:

dynamic obj = new ExpandoObject();
Func<int, int> func = x => 2*x;
obj.Foo = func;
int i = obj.Foo(123); // now you see it
obj.Foo = null; // now you don't

For properties and events (not methods), you can use the System.ComponentModel approach to change what appears at runtime, but that only impacts callers who get access via System.ComponentModel, which means mainly: UI data-binding. This is how DataTable represents columns as pseudo-properties (forgetting about "typed datasets" for the moment - it works without those).

For completeness, I should also mention extension methods. Those are more a compiler trick, not a runtime trick - but kinda allow you to add methods to an existing type - for small values of "add".

One final trick, commonly used by ORMs etc - is to dynamically subclass the type, and provide additional functionality in the subclass. For example, overriding properties to intercept them (lazy-loading, etc).

like image 155
Marc Gravell Avatar answered Nov 04 '22 05:11

Marc Gravell