.NET 4.x Dictionary - C#

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

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

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

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

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace ConsoleApplication5 {
  7.     class Program {
  8.         static void Main(string[] args) {
  9.             Dictionary<Type, Delegate> td = new Dictionary<Type, Delegate>();
  10.             td.Add(typeof(string), new Func<string>(() => "string"));
  11.             td.Add(typeof(int), new Func<int>(() => 10));
  12.             object stringResult = td[typeof(string)].Method.Invoke(null, null);
  13.             object intResult = td[typeof(int)].Method.Invoke(null, null);
  14.             Console.WriteLine(stringResult);
  15.             Console.WriteLine(intResult);
  16.             Console.ReadLine();
  17.         }
  18.     }
  19. }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут