Возможно ли создать словарь делегатов, возвращающих List? Пожалуйста, подскажите: Есть обобщенный классclass MyClass where T : class Есть в нем делегатprivate delegate List TDelegate(); И есть словарь_dctCahceActions = new Dictionary(); _dctCahceActions.Add("x", (() => { return Method1(); })); _dctCahceActions.Add("y", (() => { return Method2(); })); ... Проблема в том, что Method1, Method2 и т д возвращают List разных типов. Основная идея в том, чтобы сделать что-то вродеList res = _dctCahceActions["x"].Invoke(); Но проблема возникает еще на этапе компиляции из-за приведения. Как такое правильно решить?
Для решения данной проблемы можно использовать необобщенный делегат, который возвращает объект типа List. Затем при вызове делегата и выполнении метода можно выполнить приведение к List внутри лямбда-выражения.
Пример:
class MyClass<T> where T : class { private delegate List<T> TDelegate(); private Dictionary<string, TDelegate> _dctCahceActions = new Dictionary<string, TDelegate>(); public void AddMethod(string key, Func<List<T>> method) { _dctCahceActions.Add(key, (() => { return method(); })); } public List<T> InvokeMethod(string key) { return _dctCahceActions[key].Invoke(); } } // Пример использования MyClass<string> myClass = new MyClass<string>(); myClass.AddMethod("x", () => { return Method1(); }); myClass.AddMethod("y", () => { return Method2(); }); List<string> res = myClass.InvokeMethod("x"); List<string> Method1() { return new List<string>() { "method1" }; } List<string> Method2() { return new List<string>() { "method2" }; }
Таким образом, вы можете использовать необобщенный делегат для возврата объекта типа List и выполнить приведение внутри лямбда-выражения при вызове метода.
Для решения данной проблемы можно использовать необобщенный делегат, который возвращает объект типа List. Затем при вызове делегата и выполнении метода можно выполнить приведение к List внутри лямбда-выражения.
Пример:
class MyClass<T> where T : class{
private delegate List<T> TDelegate();
private Dictionary<string, TDelegate> _dctCahceActions = new Dictionary<string, TDelegate>();
public void AddMethod(string key, Func<List<T>> method)
{
_dctCahceActions.Add(key, (() => { return method(); }));
}
public List<T> InvokeMethod(string key)
{
return _dctCahceActions[key].Invoke();
}
}
// Пример использования
MyClass<string> myClass = new MyClass<string>();
myClass.AddMethod("x", () => { return Method1(); });
myClass.AddMethod("y", () => { return Method2(); });
List<string> res = myClass.InvokeMethod("x");
List<string> Method1()
{
return new List<string>() { "method1" };
}
List<string> Method2()
{
return new List<string>() { "method2" };
}
Таким образом, вы можете использовать необобщенный делегат для возврата объекта типа List и выполнить приведение внутри лямбда-выражения при вызове метода.