Take参数,确定它是对象还是列表<>;;如果列表<>;然后循环并将每个项目视为对象

本文关键字:列表 对象 gt lt 项目 循环 然后 Take 如果 参数 | 更新日期: 2023-09-27 18:27:47

瞄准

取一个对象或列表<>。

如果它是一个物体,那么就用它做点什么。

如果是列表<>(任何类型的列表<>)然后循环遍历每个项,并作为对象对每个项执行类似的操作,返回字典或数组(返回类型目前不重要)。

到目前为止,我所拥有的对象位。。。

  public static Dictionary<string, object> Pick (object obj, Array Picklist) {
    Dictionary<string, object> dic = new Dictionary<string, object> ();
    foreach (string key in Picklist) {
      dic.Add(key, obj.GetType ().GetProperty (key).GetValue (obj, null));
    }
    return dic;
  }

所以接下来我需要确定它是一个对象还是一个列表<>,我尝试过各种泛型,遇到的最大问题是将其放入列表<>未知类型。

如果能以任何方式做到这一点或理解正确的步骤,我们将不胜感激。

Take参数,确定它是对象还是列表<>;;如果列表<>;然后循环并将每个项目视为对象

您可以这样做:

public static Dictionary<string, object> Pick(object obj, Array Picklist) 
{
    Dictionary<string, object> dic = new Dictionary<string, object> ();
    IEnumerable items = obj as IEnumerable ?? new[] { obj };
    foreach(string key in Picklist) 
    {
        foreach(object item in items)
        {
            dic.Add(key, item.GetType().GetProperty(key).GetValue(item, null));
        }
    }
    return dic;
}

但是,请注意,如果您实际尝试提供两个或多个项,这将失败,因为它将尝试向字典添加两次相同的键。如果您试图传递一个没有指定属性的对象,它也会失败。在这种情况下,还不清楚您希望这个方法做什么,但这段代码似乎只是一个例子,所以您必须在实际代码中弄清楚细节。

FWIW,List<T>既是IEnumerable<T>又是IEnumerable(意味着其内容可以枚举为object的实例)。您可以将IEnumerable与以下链接一起使用:

object o = new List<string>() ;
...
((IEnumerable)o).Cast<object>().DoSomethingLinqy( x => ... ) ;

如果您只对区分List<T>(而不是其子类型)和任何其他类(包括List<T>的子类型)感兴趣,那么以下代码应该可以帮助您:

object o = GetSomeObject() ;
bool isGenericList = o.GetType().GetGenericTypeDefinition() == typeof(List<>) ;

如果你需要对List<T>及其亚型进行相同的治疗,那么你需要列出以下内容:

static bool IsInstanceOfGenericType( object o, Type genericType )
{
    bool isGenericTypeInstance = false ;
    for ( Type t = o.GetType() ; t != null && !isGenericTypeInstance ; t = t.BaseType )
    {
      isGenericTypeInstance =  t.IsGenericType
                            && t.GetGenericTypeDefinition() == genericType
                            ;
    }
    return isGenericType ;
}

你会这样使用:

object o = GetSomeObject() ;
bool isGenericList = isInstanceOfGenericType( o , typeof(List<>) ) ;

如果您需要能够识别实现通用接口的对象,那么复杂性就会增加。需要修改上面的函数,以便在它运行继承层次结构时,它不仅检查类型,而且检查该类型实现的每个接口(使用Type.GetInterfaces()),其方式与执行类型检查的方式类似。