将Class <Object>转换为Class <Interface>

Ano*_*ird 2 c# instance

我有一个Dog实现接口IAnimal和类的类IDbSet<Dog> DogSet.

我有以下原型: MyMethod(IDbSet<IAnimal> AnimalSet)

在尝试时,MyMethod(DogSet);我在编译时遇到错误,说明无法明确IDbSet<Dog>转换为IDbSet<IAnimal>

如果我尝试使用它MyMethod((IDbSet<IAnimal>)DogSet),我在运行时有一个错误,因为它无法强制转换.

为什么我不能Dog实施它IAnimal

代码:

public interface IAnimal{
    public String Libelle { get; }
}

public partial class Dog : IAnimal{
    public String Libelle {
        get {
            return "Hello World";
        }
    }
}

// Can't convert from 'System.Data.Entity.IDbset<Models.Dog>' to 'System.Data.Entity.IDbSet<Interfaces.IAnimal>'
public abstract MyClass : MyAbstractClass{
    public MyClass(IModel dbContext) : base(dbContext, dbContext.DOG_IDBSET) { }
}

public abstract class MyAbstractClass{
    public MyAbstractClass(Imodel dbContext, IDbSet<IAnimal>){ }
}
Run Code Online (Sandbox Code Playgroud)

编辑代码:

// Can't convert from 'System.Data.Entity.IDbset<Models.Dog>' to 'System.Data.Entity.IDbSet<T>'
public abstract MyClass<T> : MyAbstractClass<T> where T : Dog, IAnimal
{
    public MyClass(IModel dbContext) : base(dbContext, dbContext.DOG_IDBSET) { }
}

public abstract class MyAbstractClass<T> where T : Dog, IAnimal
{
    public MyAbstractClass(Imodel dbContext, IDbSet<T>){ }
}
Run Code Online (Sandbox Code Playgroud)

kaf*_*opp 5

通过设置泛型约束来要求实现接口IAnimal的类,您应该能够这样做:

public void MyMethod<T>(DbSet<T> animals) where T : class, IAnimal
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

......并打电话给:

MyMethod(DogSet);
Run Code Online (Sandbox Code Playgroud)