类型''不能用作类型参数' T'在通用类型或方法中''来自''没有隐式参考转换。到''

时间:2014-03-24 14:13:05

标签: c# wpf linq generics

我从数据库生成了Linq -to -Entity模型并对其进行了修改 - 我已经创建了界面:

public interface IValid
{
    byte Valid{ get; set; } 
}

并创建一些生成的类来继承此接口。

我编写了通用类来访问数据库中的表:

public List<T> GetValidRecords<T>() where T: class, IValid
{
    try
    {
        return _context.Set<T>().Where(x => x.Valid == 1).ToList();
    }
    catch (Exception ex)
    {
         throw new Exception(ex.Message);
    }
}

当我在单元测试中调用此方法时

var records = repositary.GetValidRecords<tableName>();

我收到错误 -

  

类型'tableName'不能在泛型类型或方法'GetValidRecords()'中用作类型参数'T'。没有从'tableName'到'IValid'的隐式引用转换。

如何解决?

编辑: 我的班级:

public partial class tableName: IValid    {
    public byte IsValid { get; set; } 
}

EDIT2: 我的呼叫方法:

public void GetValidRecordsGenericTest()
{
    var data = new List<tableName>
    {
        new tableName() {Valid = 1},
        new tableName() {Valid = 1}
    }.AsQueryable();

    var mockSet = new Mock<DbSet<tableName>>();
    mockSet.As<IQueryable<tableName>>().Setup(m => m.Provider).Returns(data.Provider);
    mockSet.As<IQueryable<tableName>>().Setup(m => m.Expression).Returns(data.Expression);
    mockSet.As<IQueryable<tableName>>().Setup(m => m.ElementType).Returns(data.ElementType);
    mockSet.As<IQueryable<tableName>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());           var mockContext = new Mock<Entities>();
    mockContext.Setup(x => x.tableNames).Returns(mockSet.Object);

    var database = new Database(mockContext.Object);
    var records = database.GetValidRecords<tableName>(); // here I get error

    Assert.AreEqual(2, records.Count, "Wrong number of gueltig records.");
}

1 个答案:

答案 0 :(得分:2)

tableName应该是这样的,因为它可以工作:

class tableName : IValid
{
    // implement IValid
}

还要确保类tableName实现与方法GetValidRecords中使用的相同的IValid接口,即来自正确名称空间的IValid