如果我有此界面:
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;
}
}