如何使用更通用的IEnumerable <t>?</t>

时间:2012-08-16 06:02:02

标签: c# generics

我的代码如下:

PropertyInfo p_info_keys = obj.GetType().GetProperty("Keys");
IEnumerable<string> keys = (IEnumerable<string>)p_info_keys.GetValue(obj, null);

foreach (string key in keys)
{
    // Some code
}

问题在于这一行:

IEnumerable<string> keys = (IEnumerable<string>)p_info_keys.GetValue(obj, null);

因为它可以是:

IEnumerable<decimal> keys = (IEnumerable<decimal>)p_info_keys.GetValue(obj, null);

我试过用这个:

IEnumerable<object> keys = (IEnumerable<object>)p_info_keys.GetValue(obj, null);

但是,当然,它不起作用。

那么,我如何使用能够接受字符串和小数的更通用的结构?

提前谢谢。

1 个答案:

答案 0 :(得分:6)

最简单的方法是使用IEnumerable<T>扩展IEnumerable的事实:

IEnumerable keys = (IEnumerable) p_info_keys.GetValue(obj, null);

foreach (object key in keys)
{
    ...
}

当然,在编译时你没有密钥的类型,但如果你试图在两种情况下使用相同的非通用代码,那么无论如何都不可能。< / p>

另一种方法是在通用方法中执行此操作:

public void Foo<T>(...)
{
    IEnumerable<T> keys = (IEnumerable<T>) p_info_keys.GetValue(obj, null);

    foreach (T key in keys)
    {
        ...
    }
}