I would go with following:
IMyDelayedCaller
interface:interface IMyDelayedCaller { void Invoke(); }
Set of
MyDelayedCaller
generic classes:class MyDelayedCaller<T1> : IMyDelayedCaller { private Action<T1> _target; public T1 _param; public MyDelayedCaller(Action<T1> target, T1 parameter) { _target = target; _param = parameter; } public void Invoke() { _target(_param); } } class MyDelayedCaller<T1, T2> : IMyDelayedCaller { private Action<T1, T2> _target; public T1 _param1; public T2 _param2; public MyDelayedCaller(Action<T1, T2> target, T1 param1, T2 param2) { _target = target; _param1 = param1; _param2 = param2; } public void Invoke() { _target(_param1, _param2); } }
I only showed for up to 2 parameters, you can make more if you need.
Change your list to
List<IMyDelayedCaller>
:List<IMyDelayedCaller> Temporary = new List<IMyDelayedCaller>();
Add items to the list with compile time type safety:
Temporary.Add(new MyDelayedCaller<int, bool>(DoSomething1, 10, true)); Temporary.Add(new MyDelayedCaller<string>(DoSomething3, "Some text"));
Invoke using interface method:
foreach (var item in Temporary) { item.Invoke(); } Temporary.Clear();
You can make stop 4. easier by providing static class which will allow your type parameters be inferred by compiler:
static class MyDelayedCaller
{
public static MyDelayedCaller<T1> Create<T1>(Action<T1> target, T1 param)
{
return new MyDelayedCaller<T1>(target, param1);
}
public static MyDelayedCaller<T1, T2> Create<T1, T2>(Action<T1, T2> target, T1 param1, T2 param2)
{
return new MyDelayedCaller<T1, T2>(target, param1, param2);
}
}
and usage:
Temporary.Add(MyDelayedCaller.Create(DoSomething1, 10, true));
Temporary.Add(MyDelayedCaller.Create(DoSomething3, "Some text"));