我很难弄清楚我在这里做错了什么。我有一些返回IQuery
对象的 LINQ,稍后在代码中,我试图列出返回的属性。这个缩写代码可以很好地解释这一点(实际的 LINQ 要复杂得多,并且涉及连接 - LINQ 本身可以正常工作):
public IQueryable<Object> FindAll()
{
var query = from user in _db.Users
select new
{
id = user.Id,
is_active = user.IsActive,
email = user.Email,
dob = user.Dob,
user.user_type,
};
return query;
}
在我的代码的其他地方:
query.ConvertToCsv();
尽管我也尝试.ToList()
在该调用中插入 a 。
有ConvertToCsv
:
public static string ConvertToCSV<TSource>(this IEnumerable<TSource> source)
{
StringBuilder sb = new StringBuilder();
var properties = typeof(TSource).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
var enumerable = source as IList<TSource> ?? source.ToList();
if (!enumerable.Any()) return "";
string headerString = "";
foreach (var prop in properties)
{
headerString += (headerString.Length > 0 ? "," : "") + prop.Name;
}
sb.AppendLine(headerString);
foreach (TSource item in enumerable)
{
string line = string.Join(",", properties.Select(p => p.GetValue(item).ToCsvValue()).ToArray());
sb.AppendLine(line);
}
return sb.ToString();
}
注意我还尝试使用以下代码提取属性名称:
PropertyInfo[] pi = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance);
var properties = pi.OrderBy(x => x.MetadataToken);
foreach (PropertyInfo p in properties)
{ etc etc }
在所有情况下,属性或字段列表都返回一个空列表,因此,我无法遍历对象以吐出标题行或数据行。跟踪所有代码并检查变量表明一切都很好,直到我到达GetProperties
/GetFields
行并且代码失败。
我犯了什么菜鸟错误?我应该用<Object>
别的东西代替吗?