Лямбда-выражение может или быть преобразовано в тип делегата или дерево выражений - но оно должно знать который тип делегата. Просто знание подписи не достаточно. Например, предположите, что я имею:
public delegate void Action1();
public delegate void Action2();
...
Delegate x = () => Console.WriteLine("hi");
, Чем Вы ожидали бы, что конкретный тип объекта, упомянутого x
, будет? Да, компилятор мог генерировать новый тип делегата с соответствующей подписью, но это редко полезно, и Вы заканчиваете с меньшей возможностью для проверки ошибок.
, Если Вы хотите помочь звонить Control.Invoke
с Action
, самая легкая вещь сделать, добавляет дополнительный метод для Управления:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate) action);
}
Я думаю, вы ищете объект Dictionary, который можно найти в библиотеке Microsoft Scripting Runtime. (Добавьте ссылку на свой проект из меню "Инструменты ... Ссылки" в VBE.)
Он практически работает с любым простым значением, которое может соответствовать варианту (ключи не могут быть массивами, и попытки сделать их объектами бессмысленны. См. Комментарий от @Nile ниже.):
Dim d As dictionary
Set d = New dictionary
d("x") = 42
d(42) = "forty-two"
d(CVErr(xlErrValue)) = "Excel #VALUE!"
Set d(101) = New Collection
Вы также можете использовать объект VBA Collection, если вам проще, и вам нужны только строковые ключи.
Я не знаю, есть ли на самом деле хеши для чего-либо, поэтому вы можете хотите копать дальше, если вам нужна производительность, подобная хэш-таблице. (EDIT: Scripting.Dictionary действительно использует хэш-таблицу внутри.)
Попробуйте использовать объект словаря или объект коллекции.
http://visualbasic.ittoolbox.com/documents/dictionary-object-vs -collection-object-12196
Я использовал класс HashTable Франческо Балены несколько раз в прошлом, когда Коллекция или Словарь не подходили идеально, и мне просто требовалась HashTable.