我正在获得Company<IDesignation>
类型的对象。现在我想把它投到ICompany<Manager>
。运行时我知道IDesignation
只是“经理”类型。
答案 0 :(得分:0)
这是你在找什么?
Company comp = new Company();
Manager mgner = new Manager(comp.getManager());
IDesignation manager = mgner;
ICompany company = (ICompany)manager;
假设公司是:
public class Company: ICompany, IDesignation //or something?
使用Generic Type Casting(您正在尝试做什么)或简单地转换接口或对象取决于您是显式地还是隐式地执行此任务(可能是类具有预先定义的函数来强制转换)以及作为您的注释已经指出...可能是由于用户或运行时的问题,或者是否和/或你需要如何实例化你的对象所以我真的需要看到类的实现,以便能够提供使用类型转换的东西。你希望如何执行它。
答案 1 :(得分:0)
您需要的是Contravariance
,即您的IEntityDelta
泛型类型参数需要逆变。
这样做的唯一方法就是:
public interface IEntityDelta<in T> : IEntityDelta where T : IEntity
请注意定义中的 in T 。
查看in (Generic Modifier) (C# Reference)
或者Understanding Covariant and Contravariant interfaces in C#
如果您不是该界面的创建者,并且如果IEntityDelta<>
未定义in
修饰符,则表示运气不佳。
只是提到添加/输出修饰符说起来容易做起来难。为了编译你的方法,属性等需要满足 该泛型类型(T)参数的逆变条件(或'out'的协方差)条件。
这就是你的类,接口看起来像你的信息(这是可怕的btw。下次你需要多花一点时间 提供有意义的最小但完整的代码):
public interface IEntityDelta<in T> : IEntityDelta
where T : IEntity
{
void MakeDelta(T entity); // this is allowed
//T Entity { get; set; } // this won't work
}
public class EntityDelta<T> : IEntityDelta<T>
where T : class, IEntity
{
public T Entity { get; set; }
public EntityDelta(T entity) => Entity = entity;
public void MakeDelta(T entity) { }
}
public interface IEntityDelta { }
public abstract class Entity : IEntity { }
public class Order : Entity { }
public interface IEntity { }
......和用法:
var order = new Order();
EntityDelta<IEntity> orderDelta = new EntityDelta<IEntity>(order);
IEntityDelta<IEntity> idelta = orderDelta;
IEntityDelta<Order> iOrderDelta = orderDelta;