将混凝土<interface>浇铸到Interface <concrete>

时间:2017-03-12 08:02:49

标签: c# generics c#-4.0 casting

我正在获得Company<IDesignation>类型的对象。现在我想把它投到ICompany<Manager>。运行时我知道IDesignation只是“经理”类型。

2 个答案:

答案 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;