如果我有此界面:

public interface IFoo : IDisposable
{
    int PropA {get; set;}
    int PropB {get; set;}
}


和一类:

public class Foo : IFoo
{
    public int PropA {get; set;}
    public int PropB {get; set;}

    public void Dispose()
    {
        Dispose();
        GC.SuppressFinalize(this);
    }
}


如果没有“无法隐式转换”错误,这是否行得通?

    private Context context = new Context();
    private GenericRepository<IFoo> FooRepo;

    public GenericRepository<IFoo> Article
    {
        get
        {
            if (this.FooRepo == null)
            {
                this.FooRepo = new GenericRepository<Foo>(context);
            }
            return FooRepo;
        }
    }


我以为我做对了,正确的方法是什么?

最佳答案

您要尝试执行的操作(将GenericRepository<Foo>引用分配给类型为GenericRepository<IFoo>的字段)仅在GenericRepository<T>在其通用类型参数中为covariant时才有效。为此,GenericRepository<>将定义为:

public class GenericRepository<out T> {...} //note the "out" modifier.


那么这个分配就可以了:

this.FooRepo = new GenericRepository<IFoo>(context);


但是,这将不起作用,因为协方差仅限于接口和委托。因此,为了在此限制内发挥作用,您可以定义协变IGenericRepository<T>接口并使用该接口代替类:

public interface IGenericRepository<out T> {}
public class GenericRepository<T> : IGenericRepository<T> { }

private Context context = new Context();
private IGenericRepository<IFoo> FooRepo;

public IGenericRepository<IFoo> Article
{
    get
    {
        if (this.FooRepo == null)
        {
            this.FooRepo = new GenericRepository<Foo>(context);
        }
        return FooRepo;
    }
}


或者,如果GenericRepository<T>实现IEnumerable,则可以使用Enumerable.Cast<T>方法:

public IGenericRepository<IFoo> Article
{
    get
    {
        if (this.FooRepo == null)
        {
            this.FooRepo = new GenericRepository<Foo>(context).Cast<IFoo>();
        }
        return FooRepo;
    }
}

10-07 23:38