无法从用法中推断出方法的类型参数。 尝试显式指定类型参数

我正在尝试使用TextChanged()事件在文本框中填充SQL Server中的自动填充文本。 [WindowsForm, C#]

我有一个部分class级表格

TextChanged事件:

 private void textBoxFilterCName_TextChanged(object sender, EventArgs e) { DataTable dt = FillCustomerName(textBoxFilterCName.Text); List listNames = CustomerName.ConvertDataTableToList(dt); textBoxFilterCName.AutoCompleteMode = AutoCompleteMode.SuggestAppend; AutoCompleteStringCollection dataName = new AutoCompleteStringCollection(); dataName.AddRange(listNames.ToArray()); textBoxFilterCName.AutoCompleteCustomSource = dataName; textBoxFilterCName.AutoCompleteSource = AutoCompleteSource.CustomSource; } 

当我调用此方法CustomerName.ConvertDataTableToList()时,我收到此错误。

无法从用法中推断出方法’CustomerName.ConvertDataTableToList(DataTable)’的类型参数。 尝试显式指定类型参数。

FillCustomerName()方法

 public DataTable FillCustomerName(string cName) { DataTable dtName = new DataTable(); List listName = new List(); try { dbconnection.Open(); string query = "SELECT [Name] FROM Customers WHERE Is_Active=1 AND Name like @CName + '%'"; using (SqlCommand cmd = new SqlCommand(query, dbconnection)) { cmd.Parameters.Add("CName", SqlDbType.VarChar).Value = cName; dtName.Load(cmd.ExecuteReader()); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Connection Error"); } finally { dbconnection.Close(); } return dtName; } 

客户名称类:

 public static class CustomerName { private static T CreateItemFromRow(DataRow row, IList properties) where T : new() { T item = new T(); foreach (var property in properties) { if (property.PropertyType == typeof(System.DayOfWeek)) { DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), row[property.Name].ToString()); property.SetValue(item, day, null); } else { property.SetValue(item, row[property.Name], null); } } return item; } public static List ConvertDataTableToList(this DataTable table) where T : new() { IList properties = typeof(T).GetProperties().ToList(); List result = new List(); foreach (var row in table.Rows) { var item = CreateItemFromRow((DataRow)row, properties); result.Add(item); } return result; } } 

在调试应用程序时,将执行查询并成功生成结果。 但我无法将数据表结果作为列表加载。

我们欢迎提供此转换的可能建议。

因此,您希望将DataTable转换为特定类型的对象列表。 对?

generics方法仅从参数中推断出generics类型T 由于您没有类型T参数,因此您需要明确指定它。 所以当你写这行时:

 List listNames = CustomerName.ConvertDataTableToList(dt); 

编译器无法推断出您想要的类型T是什么string因为它仅用于返回类型。 所以你需要明确指定:

 CustomerName.ConvertDataTableToList(dt); 

但是,由于您指定了where T : new()的条件,这意味着generics类型应该具有无参数构造函数,字符串不满足该条件。 您按名称匹配行,因此您唯一的选择是修改generics方法或创建如下所示的类:

 public class CustomerNameHolder { public string Name { set; get; } } 

然后:

 List listNames = CustomerName.ConvertDataTableToList(dt) .Select(x=> x.Name).ToList();