不确定是否可以完成此操作,但是任何帮助都会很棒。
我创建了许多POCO,它们具有一个称为Create的属性,这是我的POCO内的一个映射器函数:
public class ReturnClass1 : IReturnClass1
{
protected IReturnClass1 _returnClass;
public Create(IReturnClass1 retn)
{
var columns = Enumerable.Range(0, record.FieldCount).ToDictionary(record.GetName, i => i);
return new ReturnClass1
{
column1= columns.ContainsKey("column1") && !record.IsDBNull(columns["column1"]) ? (DateTime?) record["column1"] : null,
column2 = columns.ContainsKey("column2") && !record.IsDBNull(columns["column2"]) ? (DateTime?) record["column2"] : null
}
}
}
我创建了一个可以返回List的通用类。
public class ExecSqlServer
{
public List<T> GetCollection<T>(StoredProcedureVariables args, int timeout = -1) where T: new()
{
var sqlDao = new DaoSqlServer();
var sqlCmd = sqlDao.GetSprocCommand("stored_procedure_name");
if (timeout >= 0) sqlCmd.CommandTimeout = timeout;
sqlCmd.Parameters.Add(sqlDao.CreateParameter("variableString", args.VariableString));
return (List<T>)Convert.ChangeType(sqlDao.GetList(sqlCmd, new T().Create).ToList(), typeof(T));
}
}
我遇到的问题是我需要调用Create,但是不能这样做,因为T不包含定义。
如何获得定义?
答案 0 :(得分:0)
您应该在通用方法中添加另一个约束:
public List<T> GetCollection<T>(StoredProcedureVariables args, int timeout = -1) where T: IReturnClass1, new()
答案 1 :(得分:0)
您在GetCollection
方法上键入约束未指定T
应该是什么,因此编译器无法知道Create
方法。
因为现在您可以使用几乎任何类型的方法来调用该方法,例如GetCollection<SomeOtherClass>()...
,并且该类不包含Create
。
假设Create
方法在界面上,则很可能是您想要的:
public List<T> GetCollection<T>(StoredProcedureVariables args, int timeout = -1)
where T: IReturnClass1, new()
{
var sqlDao = new DaoSqlServer();
var sqlCmd = sqlDao.GetSprocCommand("stored_procedure_name");
if (timeout >= 0) sqlCmd.CommandTimeout = timeout;
sqlCmd.Parameters.Add(sqlDao.CreateParameter("variableString", args.VariableString));
return (List<T>)Convert.ChangeType(sqlDao.GetList(sqlCmd, new T().Create).ToList(), typeof(T));
}