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

后端 未结 2 804
别那么骄傲
别那么骄傲 2020-12-09 20:26

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 cla

相关标签:
2条回答
  • 2020-12-09 20:42

    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.

    0 讨论(0)
  • 2020-12-09 20:49

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

    0 讨论(0)
提交回复
热议问题