2

キーを文字列または10進数にすることができる辞書があります。値は、さまざまなタイプのオブジェクトにすることができます。すべての場合に辞書項目の削除を管理できるコードを書きたいと思います。

置き換えたいコードは次のとおりです。

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);
}

しかし、次のエラーメッセージが表示されます:あいまいな一致が見つかりました。

私はインターネットでいくつかの記事を読んだことがあり、この呼び出しで2番目のパラメーターを指定する必要があると言われています。

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

しかし、私はそれを行う方法がわかりません。

どんな助けでもありがたいです。

前もって感謝します。

4

1 に答える 1

1

これを試して:

var genericArguments = cacheItem.Value.GetType().GetGenericArguments();
var keyType = genericArguments[0]; // Maybe implement some error handling.
MethodInfo info = t.GetMethod("Remove", new [] { keyType });
于 2012-08-22T12:22:41.220 に答える