简体   繁体   中英

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.

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

is it possible to delete methods / classes at runtime?

Suppose that it was possible. Calls to those methods would fail and produce undefined (but usually catastrophic) behaviour.

So I'm sure it is not possible.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM