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 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.
Connecting a method call to the method body is known as binding. Static Binding (also known as Early Binding).
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With