Sasha
Sasha

Reputation: 853

The type '' cannot be used as type parameter 'T' in the generic type or method ''. There is no implicit reference conversion from '' to ''

I generated Linq -to -Entity model from database and modified it - I've made interface :

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

and make some generated classes to inherit this interface.

I've wrote generic class to access tables from database:

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

When I call this method in my unit test

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

I get error -

The type 'tableName' cannot be used as type parameter 'T' in the generic type or method 'GetValidRecords()'. There is no implicit reference conversion from 'tableName' to 'IValid'.

How to fix it?

EDIT: my table class:

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

EDIT2: My calling method:

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.");
}

Upvotes: 3

Views: 19689

Answers (1)

helb
helb

Reputation: 7793

tableName should be something like this for it to work:

class tableName : IValid
{
    // implement IValid
}

Also make sure that the class tableName implements the same IValid interface as used in the method GetValidRecords, i.e. the IValid from the correct namespace.

Upvotes: 2

Related Questions