Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用更通用的IEnumerable<;T>;?_C#_Generics - Fatal编程技术网

C# 如何使用更通用的IEnumerable<;T>;?

C# 如何使用更通用的IEnumerable<;T>;?,c#,generics,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 } PropertyInfo p_info_keys=obj.GetTyp

我的代码如下:

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
}
PropertyInfo p_info_keys=obj.GetType().GetProperty(“keys”);
IEnumerable keys=(IEnumerable)p_info_keys.GetValue(obj,null);
foreach(字符串键入键)
{
//一些代码
}
问题在于这一行:

IEnumerable<string> keys = (IEnumerable<string>)p_info_keys.GetValue(obj, null);
IEnumerable keys=(IEnumerable)p_info_keys.GetValue(obj,null);
因为它可以是:

IEnumerable<decimal> keys = (IEnumerable<decimal>)p_info_keys.GetValue(obj, null);
IEnumerable keys=(IEnumerable)p_info_keys.GetValue(obj,null);
我试着用这个:

IEnumerable<object> keys = (IEnumerable<object>)p_info_keys.GetValue(obj, null);
IEnumerable keys=(IEnumerable)p_info_keys.GetValue(obj,null);
但是,当然,它不起作用

那么,我如何使用可以同时接受字符串和十进制的更通用的构造呢


提前谢谢。

最简单的方法是使用
IEnumerable
扩展
IEnumerable

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

foreach (object key in keys)
{
    ...
}
当然,您在编译时并没有键的类型,但如果您试图对这两种情况使用相同的非泛型代码,那么无论如何这都是不可能的

另一种方法是采用通用方法:

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

    foreach (T key in keys)
    {
        ...
    }
}
public void Foo(…)
{
IEnumerable keys=(IEnumerable)p_info_keys.GetValue(obj,null);
foreach(T键入键)
{
...
}
}

@elyashiv:是的,但那没什么区别。编译器只会在第一种情况下推断类型为
IEnumerable
,在第二种情况下推断类型为
IEnumerable
。它会减少代码中的字符数,但这是唯一的效果。有人将其标记为
Java
,但它看起来更像
C