泛型,属性调用

时间:2018-09-14 14:31:12

标签: c# generics

不确定是否可以完成此操作,但是任何帮助都会很棒。

我创建了许多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不包含定义。

如何获得定义?

2 个答案:

答案 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));
}