sooo,星期五晚上,练习的最佳时间:) 我正在努力解决这个问题:
var collection = rows.Skip(skipHeader ? 1 : 0)
.Select(row =>
{
try
{
var tnew = new T();
columns.ForEach(col =>
{//for simplicity removed some code
var val = worksheet.Cells[row, col.Column];
if (col.Property.PropertyType == typeof(double))
{
col.Property.SetValue(tnew, val.GetValue<double>());
return;
}
col.Property.SetValue(tnew, val.GetValue<string>());
});
return tnew;
}
catch (Exception e)
{
Console.WriteLine($"Could not create object from excel: {e}");
//return default(T); dont do anything <<=== here i the problem
}
}).ToList();
这个想法是这种通用的代码和平从excel连续读取并创建新的T
对象。但是,如果有可能行/ excel中有更多数据需要(我不需要的元数据)。
所以基本上我需要检查一切是否顺利。如果它进入异常,那么我知道它不适合模态,所以跳过那一行。
有什么想法吗?
答案 0 :(得分:0)
当返回default(T)
时,我得到了正确的对象。
在替补之前,我可以做一个:
.Where(r => !EqualityComparer<T>.Default.Equals(r, default(T)))
以便跳过默认初始化:)
答案 1 :(得分:0)
我建议将逻辑封装在一个单独的函数中:
public bool TryCreate<T>(YourType row, out T result) where T : class
{
try
{
//set result to a properly initialized object
return true;
}
catch(Exception e)
{
result = null; // or default(T) and remove constraint
return false;
}
}
然后喜欢this answer:
var result = rows.Skip(skipHeader ? 1 : 0)
.Select(row => new { Success = TryCreateT(row, out var value), value })
.Where(pair => pair.Success)
.Select(pair => pair.value);
当您评论说您无法返回null
时,您可以执行以下两项操作之一:向方法添加class
的通用约束或使用default(T)