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.
In regular C# / .NET, the answer is a simple “no”. The most you can do is write a
DynamicMethodwhich 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 withExpandoObjectby attaching delegates in place of methods, but on a custom dynamic type you can do most anything – but this only impacts callers who use thedynamicAPI. For a basicExpandoObjectexample:For properties and events (not methods), you can use the
System.ComponentModelapproach to change what appears at runtime, but that only impacts callers who get access viaSystem.ComponentModel, which means mainly: UI data-binding. This is howDataTablerepresents 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).