如何获得从字典返回的委托

本文关键字:返回 字典 何获得 | 更新日期: 2023-09-27 18:05:52

我试图使用字典来引用委托,但当我尝试检索委托指针时,我得到一个错误。对于更多的上下文,我被给予一个字符串,用于查找C结构中的值。我已经编写了在C结构中获取/设置数据的方法,但我现在需要调用给定字符串的方法。如果你有更好的方法,请告诉我。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestCode
{
    public class tuboFillLinePresets
    {
        public IDictionary<string, object> DBLookup { get;  set; }
        public config_data Data;
        delegate float MyDel(int chan);
        public float ChanGain(int chan)
        {
            return Data.ChannelGain(chan);
        }
        public float MagCurr(int chan)
        {
           return Data.MagCurrent(chan);
        }
        public tuboFillLinePresets()
        {
            DBLookup = new Dictionary<string, object>();
            MyDel cg = new MyDel(ChanGain);
            MyDel mc = new MyDel(MagCurr);
            DBLookup.Add("HBGain", cg);
            DBLookup.Add("LBGain", cg);
            DBLookup.Add("MagCurrent", mc);
        }
        public LinePresets tuboGetLinePresets(LinePresets LinePresets)
        {
           foreach (var item in LinePresets.Parameters)
           {
               String s = item.Key;
               MyDel func;
               DBLookup.TryGetValue(s, out func);  // error here 
               LinePresets.Parameters[s] = func(3);
           }
           return LinePresets;
       }
   }
}

如何获得从字典返回的委托

您的DBLookup字段应该是Dictionary<string, MyDel>。这样,当获取值时,返回的类型将是MyDel,而不是object

得到错误是因为作为out实参传递的引用的类型必须与形参的类型完全匹配。由于out参数的类型是MyDel,而TryGetValue上的参数是object(因为这是字典中值的类型),因此会出现错误。一旦进行了上述更改,实参的类型将与形参的类型匹配,错误消息将消失。

通常,如果您发现自己声明了一个保存object值的字典,请考虑您实际要存储的内容,并查看是否可以使用不同的类型。

定义你的字典

public IDictionary<string, MyDel> DBLookup { get;  set; }

您的字典存储objects,而不是MyDel的实例。因为你完全有可能这样做:

DBLookup.Add("foo", "HAH!");

编译器不会让你传递一个不能保存字典中可以保存的任何值的变量作为out。您有两个选择:

  • 将字典更改为Dictionary<string, MyDel>(如果字典实际上只存储带有字符串键的MyDel实例,这是最好的选择)
  • 使用中间变量进行检索

一样:

object value;
if(DBLookup.TryGetValue(s, out value) && value is MyDel)
{
    func = (MyDel)value;
    LingPresents.Parameters[s] = func(3)
}

或者如果你需要一个对象类型,比如在TryGetValue中字典中的值,首先使用一个对象来获取一个值,然后在转换它的委托类型后,你肯定会被检索到