如何解决您可以检查T是否继承自IEnumerable <T>,然后使用IEnumerable <T>可用的方法吗?
所以我要创建一个通用方法,因此签名显然可以接受任何类型的对象。我遇到的问题是我希望用户能够只将一个对象发送到我的方法,或者将对象的集合(我知道,与IEnumerable不同的接口)发送给我。现在,由于(T obj)可以是一个对象,也可以是对象列表或对象数组,因此我不确定如何根据其是否为集合来检查和更改行为。
这就是我所拥有的,并且我收到编译器错误CS1061,T不包含FirstOrDefault的定义。这是有道理的,因为可能没有。但是据我所知,我的条件应该已经检查了。
if (typeof(IEnumerable<T>).IsAssignableFrom(obj.GetType()))
{
foreach (var info in obj.FirstOrDefault().GetType().GetProperties())
{
members.Add(info.Name,info.GetValue(obj).ToString());
}
}
else
{
foreach (var info in obj.GetType().GetProperties())
{
members.Add(info.Name,info.GetValue(obj).ToString());
}
}
如果有任何不同,成员是Dictionary
解决方法
在访问obj
之前,必须将IEnumerable<T>
强制转换为FirstOrDefault
。而且,您可以使用is运算符来完成此操作。
if (obj is IEnumerable<T> e)
{
foreach (var info in e.FirstOrDefault().GetType().GetProperties))
...
}
...
您的代码没什么问题,除了您使用obj
而不先进行强制转换。例如,您可以这样做:
if (typeof(IEnumerable<T>).IsAssignableFrom(obj.GetType()))
{
var e = (IEnumerable<T>)obj;
foreach (var info in e.FirstOrDefault().GetType().GetProperties())
{
members.Add(info.Name,info.GetValue(obj).ToString());
}
...
尽管您可以看到,使用is
却更短,更易于阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。