5

我在 C# 中有一个在通用字典上运行的函数:

public static string DoStuff<TKey, TValue>(Dictionary<TKey, TValue> dictionary)
{
    // ... stuff happens here
}

我还有一个循环对象的函数。如果其中一个对象是 Dictionary<>,我需要将它传递给该通用函数。但是,我不知道在编译时键或值的类型是什么:

foreach (object o in Values)
{
    if (/*o is Dictionary<??,??>*/)
    {
        var dictionary = /* cast o to some sort of Dictionary<> */;
        DoStuff(dictionary);
    }
}

我该怎么做呢?

4

2 回答 2

6

假设您不能使您的方法在Values集合类型中通用,您可以使用动态:

foreach (object o in values)
{
    Type t = o.GetType();
    if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary<,>))
    {
        string str = DoStuff((dynamic)o);
        Console.WriteLine(str);
    }
}

或者,您可以使用反射:

foreach (object o in values)
{
    Type t = o.GetType();
    if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary<,>))
    {
        var typeParams = t.GetGenericArguments();
        var method = typeof(ContainingType).GetMethod("DoStuff").MakeGenericMethod(typeParams);
        string str = (string)method.Invoke(null, new[] { o });
    }
}
于 2012-11-30T23:00:17.217 回答
4

如果您知道Value集合中的所有字典都是相同的,则也使您的函数具有通用性:

void DealWithIt<T,V>(IEnumerable Values)
{
foreach (object item in Values)
{
    var dictionary = item as Dictionary<T,V>;
    if (dictionary != null)
    {
        DoStuff<T,V>(dictionary);
    }
}

否则,在深入研究严肃的反射代码之前,请考虑使用非泛型IDictionary传递给它。DoStuff

于 2012-11-30T22:49:19.353 回答