我正在尝试使用字典来引用委托,但是当我尝试检索委托指针时出现错误。对于更多上下文,我被赋予一个字符串用于在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;
}
}
}
答案 0 :(得分:6)
您的DBLookup
字段应为Dictionary<string, MyDel>
。这样,获取值时,返回的类型将是MyDel
,而不是object
。
您收到错误,因为作为out
参数传递的引用类型必须与参数的类型完全匹配。由于out
参数的类型为MyDel
且TryGetValue
上的参数为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中需要像字典中的值那样的对象类型,首先使用一个对象来获取一个值,然后在转换它委托类型后,你肯定会被检索。