I would suggest one of twoseveral things.
The untyped ugly way:
Change If you want to maintain encapsulation, so that the signature IWorker.DoWorkcallsites don't have to string IWorker.DoWork(object[] args)know anything about the inner workings of the workers or the worker factory, then you'll need to change the interface to have the extra parameter.
This will allow total flexibility in arguments and future extension The parameter can have a default value, at the cost of type safetyso that some callsites can still just use 2 parameters. This will probably take less effort to implement, but will be a pain to debugrequire that any consuming libraries are recompiled.
The cleaner generic way:
Create a series of interfaces IWorker<T>, IWorker<T1, T2>The other option I would recommend against, as it breaks encapsulation and is just generally bad OOP. This also requires that you can at least modify all the callsites for IWorker<T1, T2, T3>ConcreteWorkerB, etc. in You could create a similar fashion toclass that implements the Func<T>IWorker interface, but also has a Func<T1, T2>DoWork etc. delegatesmethod with an extra parameter. In your case,Then in your existing sites usingcallsites attempt to cast the ConcreteWorkerAIWorker type would usewith IWorker<int,var List<int>>workerB = myIWorker as ConcreteWorkerB; and the ConcreteWorkerB sites wouldthen use the three parameter IWorker<int, List<int>, string>DoWork. The instances of the versions with less arguments could always be converted to versions with more arguments by using a default argument for on the extra parametersconcrete type. So to continue to use the workers with different argument lists interchangeably, you would have to make the factory create workers with 3 arguments Again, and using default values where needed.
I don't think there is anyway you can practically make this extension without breaking all existing callsitesis a bad idea, but the changeit is something you make now can provide a path for extensibility in the futurecould do.