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

c#, dynamic, reflection.emit

Solution

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).

Problem

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.

Original source

Related problems