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;
}
所以接下来我需要确定它是一个对象还是一个列表<>,我尝试过各种泛型,遇到的最大问题是将其放入列表<>未知类型。
如果能以任何方式做到这一点或理解正确的步骤,我们将不胜感激。
您可以这样做:
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()
),其方式与执行类型检查的方式类似。