使用C#我将对象的属性值提取到DataGrid中,这对于简单的数据类型很有效。但是当有一个List我想只提取第一个值时,附加一个省略号并出现一个工具提示,通知用户点击查看整个列表。
这是我到目前为止的代码:
public static DataTable ConvertListToDataTable<T>(List<T> list)
{
DataTable dt = new DataTable();
foreach (PropertyInfo info in typeof(T).GetProperties())
{
dt.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType));
}
foreach (T t in list)
{
DataRow row = dt.NewRow();
foreach (PropertyInfo info in typeof(T).GetProperties())
{
if (info.PropertyType.GetInterfaces().Contains(typeof(System.Collections.ICollection)))
{
if(!info.GetValue(t,null).Equals(null))
{
row[info.Name] = String.Concat(info.GetValue(t, new object[]{ 0 }).ToString(), "...");
}
}
else
{
row[info.Name] = info.GetValue(t, null) ?? DBNull.Value;
}
}
dt.Rows.Add(row);
}
return dt;
}
简单的数据类型提取没有任何问题。
确定哪些属性有列表后,我正在努力提取列表的第一个值。提供的代码抛出异常:
info.GetValue(t, new object[]{ 1 })' threw an exception of type 'System.Reflection.TargetParameterCountException'
base: {System.Reflection.TargetParameterCountException: Parameter count mismatch.
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)}