Если вы не хотите вызывать его динамически через динамический или Delegate.DynamicInvoke, вы можете использовать несколько общих методов расширения для выполнения теста за вас.
Сначала сделайте ваш словарь словарёмвместо объекта.
Затем создайте несколько методов расширения (или больше, чтобы соответствовать типам делегатов, которые вас интересуют).
public static bool TryInvoke<T>(this Delegate del, T arg)
{
var action = del as Action<T>;
if (action != null)
{
action(arg);
return true;
}
return false;
}
public static bool TryFunc<T, TResult>(this Delegate del, T arg, out TResult result)
{
result = default(TResult);
var func = del as Func<T, TResult>;
if (func != null)
{
result = func(arg);
return true;
}
return false;
}
Наконец, вы используете свои методы расширения следующим образом...
var value = dict[key];
if (value.TryInvoke(20))
{
// do something...
}
else
{
int result;
if (value.TryInvoke(20, out result))
{
// do something else...
}
}
Нетрудно представить, что можно создать небольшую библиотеку и использовать ее повторно.