У меня есть метод, который преобразует List<T>
в DataTable
с использованием отражения. Я хочу использовать этот метод для создания DataSet, передавая несколько списков, где каждый список может содержать другой тип объекта.C# Доступ к универсальному методу без знания определенного типа
Ниже приведен код, который дает мне компиляции ошибки времени:
- в строке "var dt = Util.ListToDataTable(item);
"
public static class Util
{
public static DataSet GetDataSet(List<string> title, List<IList> data)
{
DataSet ds = new DataSet();
int idx= 0;
foreach (var item in data)
{
//here I get compile time error "The type arguments for method
// 'ExportToExcel.CreateExcelFile.ListToDataTable<T>
// (System.Collections.Generic.List<T>)' cannot be inferred from the usage.
// Try specifying the type arguments explicitly. "
var dt = Util.ListToDataTable(item);
if (title.Count >= idx)
{
dt.TableName = title[idx];
}
idx++;
ds.Tables.Add(dt);
}
return ds;
}
public static System.Data.DataTable ListToDataTable<T>(List<T> list)
{
var dt = new System.Data.DataTable();
foreach (PropertyInfo info in typeof(T).GetProperties())
{
dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
}
foreach (T t in list)
{
DataRow row = dt.NewRow();
foreach (PropertyInfo info in typeof(T).GetProperties())
{
row[info.Name] = info.GetValue(t, null);
}
dt.Rows.Add(row);
}
return dt;
}
}
И это я называю TestMethod
[TestMethod]
public void TestDataSetGeneration_WithMultipleLists()
{
IList list = new List<User>();
list.Add(new User(){FirstName = "Mahesh", LastName = "Chaudhari", IsExternal = true, UpdatedOn = DateTime.Now});
list.Add(new User(){FirstName = "Mahesh1",LastName = "Chaudhari1",IsExternal = true,UpdatedOn = DateTime.Now});
list.Add(new User(){FirstName = "Mahesh2",LastName = "Chaudhari2",IsExternal = false,UpdatedOn = DateTime.Now});
IList hcps = new List<HCPUser>() { new HCPUser(){FirstName = "HCP1",LastName = "HCP1"}};
var lists = new List<IList>();
lists.Add(list);
lists.Add(hcps);
var titles = new List<String> { "Users", "HCPs"};
var result = Util.GetDataSet(titles ,lists);
Assert.IsTrue(result != null);
}
"
The type arguments for method 'ExportToExcel.CreateExcelFile.ListToDataTable<T>(System.Collections.Generic.List<T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly
."
Я думаю, что метод Util.ListToDataTable требует определенного типа, который он получает только во время выполнения. В таком сценарии, как я могу назвать этот метод?
Ирония в этом вопросе: у меня есть код, который делает то же самое (в основном), но я делаю это совершенно по-другому. Хороший Q, кстати, очень хорошо написан. – theMayer
Используете ли вы WPF? Или WinForms? – theMayer
@ theMayer: этот метод написан в библиотеке классов C#, передаваемой по проекту WebAPI – Mahesh