.NET 4.x Dictionary - C#

Узнай цену своей работы

Формулировка задачи:

Привет всем! Хочу создать словарь делегатов. И не могу найти, как. Везде, где я хожу, например тут приведены примеры скорее словаря функций по единому образцу - эталонному делегату, например:
delegate void MyFunc(string a, int b, double c);
 
void Foo(string a, int b, double c) { }
void Bar(string a, int b, double c) { }
 
var dict = new Dictionary<string, MyFunc>();
dict.Add("foo", Foo);
dict.Add("bar", Bar);
а мне нужно хранить делегаты с разной сигнатурой Пытался сделать так:
            Dictionary<Type, Delegate> TD = new System.Collections.Generic.Dictionary<Type, Delegate>();
            TD.Add(typeof(string),delegate string GetString);
так:
            delegate string GetString();
//***
            Dictionary<Type, Delegate> TD = new System.Collections.Generic.Dictionary<Type, Delegate>();
            TD.Add(typeof(string), GetString);
так:
               delegate string GetString();
//8***
         GetString getString;
            Dictionary<Type, Delegate> TD = new System.Collections.Generic.Dictionary<Type, Delegate>();
            TD.Add(typeof(string), getString);
никак не проходит Отличие в сигнатуре только в возвращаемых значениях: Double, int, DateTime и String Как-нибудь это возможно сделать или я пытаюсь туда запихнуть незапихуемое?
В последнем случае кстати ругается на неприсвоенное значение, т.е. если я присвою getString какую-то функцию, то может и сработает. Правда коряво, т.к. могу ей присвоить только номинальную псевдофункцию, кот. мне не нужна на этапе создания словаря. Но и в принципе это уже не то, что нужно, т.к. опять получится коллекция функций, а не делегатов. Хочу туда именно GetString запхнуть
Опережая вопрос, нафига мне это все нужно. Для этого:
                        
delegate double GetProp();
GetProp getPro = (GetProp)Delegate.CreateDelegate(
                            typeof(GetProp),
                            obj[i],
                            (string)p.Key);
вместо GetProp хочу вставить например TD[typeof(string)], чтобы не прибегать к проверкам типа на if else Кстати пробовал так:
        delegate dynamic GetProp();
и
        delegate object GetProp();
чтобы унифицировать делегат, но на
                        GetProp getPro = (GetProp)Delegate.CreateDelegate(
                            typeof(GetProp),
                            obj[i],
                            (string)p.Key);
ругается, что
Не удается привязать целевой метод, поскольку его сигнатура или прозрачность безопасности несовместима с сигнатурой или прозрачностью безопасности типа делегата.
Даже на TypeValue так же ругается

Решение задачи: «.NET 4.x Dictionary»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication5 {
    class Program {
        static void Main(string[] args) {
            Dictionary<Type, Delegate> td = new Dictionary<Type, Delegate>();
            td.Add(typeof(string), new Func<string>(() => "string"));
            td.Add(typeof(int), new Func<int>(() => 10));
            object stringResult = td[typeof(string)].Method.Invoke(null, null);
            object intResult = td[typeof(int)].Method.Invoke(null, null);
            Console.WriteLine(stringResult);
            Console.WriteLine(intResult);
            Console.ReadLine();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5