C#:如何使用反射从字典中删除项目?

时间:2012-08-22 10:58:45

标签: reflection dictionary

我有一个字典,其中键可以是字符串或小数。值可以是不同类型的对象。我想编写可以管理在所有情况下删除字典项的代码。

我要替换的代码如下:

ConcurrentDictionary<string, Parus.Metadata.Units.Unit> objDict = cacheItem.Value as ConcurrentDictionary<string, Parus.Metadata.Units.Unit>;
foreach (var detaildGrid in this.MasterGridFrameControl.ChildFrames)
{
    foreach (GridDataItem item in detaildGrid.GridControl.SelectedItems)
    {
        object dataKey = item.GetDataKeyValue("SubKey");
        objDict.Remove((string)dataKey);
    }
}

或如下:

ConcurrentDictionary<decimal, Domain> objDict = cacheItem.Value as ConcurrentDictionary<decimal, Domain>;
foreach (GridFrameControl detaildGrid in this.MasterGridFrameControl.ChildFrames)
{
    foreach (GridDataItem item in detaildGrid.GridControl.SelectedItems)
    {
        object dataKey = item.GetDataKeyValue("SubKey");
        objDict.Remove((decimal)dataKey);
    }
}

代码应如下所示:

foreach (GridDataItem item in detaildGrid.GridControl.SelectedItems)
{
    object dataKey = item.GetDataKeyValue("SubKey");
    object[] parameters = { dataKey };
    Type t = cacheItem.Value.GetType();
    MethodInfo info = t.GetMethod("Remove");
    info.Invoke(cacheItem.Value, parameters);
}

但是,我收到此错误消息:找到了模糊的匹配。

我在互联网上看过一些文章,他们说我应该在这个电话中指定第二个参数:

MethodInfo info = t.GetMethod("Remove");

但是,我不知道该怎么做。

任何帮助都表示赞赏。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

试试这个:

var genericArguments = cacheItem.Value.GetType().GetGenericArguments();
var keyType = genericArguments[0]; // Maybe implement some error handling.
MethodInfo info = t.GetMethod("Remove", new [] { keyType });