.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();
}
}
}