我上课了。就像那样;
public class AlarmSeverityDto
{
private readonly DataRow _dr;
public object this[string columnname] { get { return _dr[columnname]; } }
public string Id { get { return Convert.ToString((_dr["Id"])); } }
public string Description { get { return Convert.ToString((_dr["Description"])); } }
public AlarmSeverityDto(DataRow dr)
{
_dr = dr;
}
}
我像这样使用这个类;
public List<AlarmSeverityDto> GetAlarmSeverityDtos()
{
var resultList = new List<AlarmSeverityDto>();
var dataSet = new DataSet();
using (OdbcConnection connection = new OdbcConnection(_szConn))
{
var query = string.Format("SELECT Id, Description " +
"FROM tblAlarmSeverityType");
OdbcDataAdapter adapter = new OdbcDataAdapter(query, connection);
try
{
connection.Open();
adapter.Fill(dataSet);
if (dataSet.Tables[0].Rows.Count > 0)
{
foreach (DataRow hbrow in dataSet.Tables[0].Rows)
{
var alarmSeverityDto = new AlarmSeverityDto(hbrow);
resultList.Add(alarmSeverityDto);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return resultList;
}
我想制作通用的GetAlarmSeverityDtos。但我不能用泛型做到这一点。我试过,但我不能做一行。我的Generic类就是这样;
public List<T> GetDataTable<T>(string query) where T : class,new()
但是我应该为这条线做什么呢?
var alarmSeverityDto = new AlarmSeverityDto(hbrow);
如何用泛型类编写这一行?
答案 0 :(得分:2)
您可以使用Activator.CreateInstance
或者另一种方式(根据您的需要),您可以使用界面
public interface IMyAwesomeInterface
{
DataRow DataRow { get; set; }
}
...
public class AlarmSeverityDto : IMyAwesomeInterface
...
public List<T> GetAlarmSeverityDtos<T>() where T : IMyAwesomeInterface, new()
{
...
var alarmSeverityDto = new T() { DataRow = hbrow};
resultList.Add(alarmSeverityDto);
...
}
答案 1 :(得分:0)
您可以传入一个工厂函数,该函数指定如何将数据行转换为T.例如:
public List<T> GetDataTable<T>(string query, Func<DataRow, T> factory )
然后在GetDataTable中,通过调用回调来创建实例:
T record = factory(hbrow);
最后,可以通过传递回调来调用GetDataTable。 E.g:
List<AlarmSeverityDto> result = GetDataTable<AlarmSeverityDto>( query,
row => new AlarmSeverityDto(row) );
这允许类型变量为任何类型,而无需支持特定接口,也不必依赖运行时激活服务。