如何从iDictionary返回一个委托?

时间:2011-08-16 19:56:54

标签: c# delegates idictionary

我正在尝试使用字典来引用委托,但是当我尝试检索委托指针时出现错误。对于更多上下文,我被赋予一个字符串用于在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;
       }
   }
}

4 个答案:

答案 0 :(得分:6)

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

您收到错误,因为作为out参数传递的引用类型必须与参数的类型完全匹配。由于out参数的类型为MyDelTryGetValue上的参数为object(因为这是字典中值的类型),因此会出现错误。完成上述更改后,参数的类型将与参数的类型匹配,错误消息将消失。

通常,如果您发现自己声明了包含object值的字典,请考虑您实际存储的内容,并查看是否可以使用其他类型。

答案 1 :(得分:1)

将您的词典定义为

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

并相应地更改其余代码......

答案 2 :(得分:1)

您的词典存储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)
}

答案 3 :(得分:0)

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