.NET 4.x Dictionary - C#
Формулировка задачи:
Привет всем! Хочу создать словарь делегатов. И не могу найти, как. Везде, где я хожу, например тут приведены примеры скорее словаря функций по единому образцу - эталонному делегату, например:
а мне нужно хранить делегаты с разной сигнатурой
Пытался сделать так:
так:
так:
никак не проходит
Отличие в сигнатуре только в возвращаемых значениях: Double, int, DateTime и String
Как-нибудь это возможно сделать или я пытаюсь туда запихнуть незапихуемое?
вместо GetProp хочу вставить например TD[typeof(string)], чтобы не прибегать к проверкам типа на if else
Кстати пробовал так:
и
чтобы унифицировать делегат, но на
ругается, что
Даже на TypeValue так же ругается
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);
В последнем случае кстати ругается на неприсвоенное значение, т.е. если я присвою getString какую-то функцию, то может и сработает. Правда коряво, т.к. могу ей присвоить только номинальную псевдофункцию, кот. мне не нужна на этапе создания словаря. Но и в принципе это уже не то, что нужно, т.к. опять получится коллекция функций, а не делегатов. Хочу туда именно GetString запхнуть
Опережая вопрос, нафига мне это все нужно. Для этого:
delegate double GetProp(); GetProp getPro = (GetProp)Delegate.CreateDelegate( typeof(GetProp), obj[i], (string)p.Key);
delegate dynamic GetProp();
delegate object GetProp();
GetProp getPro = (GetProp)Delegate.CreateDelegate( typeof(GetProp), obj[i], (string)p.Key);
Не удается привязать целевой метод, поскольку его сигнатура или прозрачность безопасности несовместима с сигнатурой или прозрачностью безопасности типа делегата.
Решение задачи: «.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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д