2

如果我有这个界面:

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

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

4

2 回答 2

3

您正在尝试做的事情(分配GenericRepository<Foo>对 type 字段的引用GenericRepository<IFoo>)只有在其泛型类型参数GenericRepository<T>协变时才有效。为此,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;
    }
}
于 2012-12-13T19:17:39.727 回答
1

您正在尝试将上下文隐式转换为 Foo 而不是它的接口。另外,上下文是否实现了 IFoo?如果是,这应该有效。

试试这个:

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

public GenericRepository<IFoo> Article
{
    get
    {
        if (this.FooRepo == null)
        {
            this.FooRepo = new GenericRepository<IFoo>(context);
        }
        return FooRepo;
    }
}
于 2012-12-13T18:23:11.173 回答