我有两个接口,如下所示:
public interface IEntityViewModel<T> : IEntityViewModel where T : class, ICLEntity
{
new T Entity { get; set; }
}
public interface IEntityViewModel
{
void LoadEntity(int primaryKey);
bool? DialogResult { get; set; }
ICLEntity Entity { get; set; }
}
当我实现一个类时,如何确保该类上出现的Entity属性是通用T?这是一个示例类:
public abstract class EntityConductor<T> : IEntityViewModel<T>
where T : class, ICLEntity
{
public T Entity
{
get; set;
}
}
编译器要求我也添加IEntityViewModel实现,例如:
ICLEntity IEntityViewModel.Entity
{
get
{
return ActiveItem.Entity;
}
set
{
ActiveItem.Entity = value as T;
}
}
然后我在课堂上得到两个Entity属性,这不是我需要的。如果实现泛型接口,我需要将Entity属性设置为T类型,如果是非泛型,则需要为ICLEntity类型。
如何做到这一点?我错过了一些简单的事吗?我使用的是.NET 4.0,协方差可以帮助我吗?
谢谢!
答案 0 :(得分:0)
我不认为这可以做到。你几乎已经拥有了所能做的最好的东西。
public abstract class EntityConductor<T> : IEntityViewModel<T>
where T : class, ICLEntity
{
public T Entity { get; set; }
ICLEntity IEntityViewModel.Entity
{
get { return Entity; }
set { Entity = (T)value; }
}
}
这应确保在使用IEntityViewModel对象时可以使用强类型属性,但如果您只知道它是IEntityViewModel对象,那么您将使用弱类型属性。没有额外的存储要求,所以我没有看到这个问题。此构造反映了您的使用场景 - 您有一个对象,但在某些情况下,您可能没有允许使用强类型属性的类型信息。
作为旁注,如果参数类型错误,IEntityViewModel.Entity中的setter应抛出异常。