【问题标题】:Cast concrete<Interface> to Interface<concrete>将混凝土<Interface> 浇铸到Interface<concrete>
【发布时间】:2017-08-02 09:04:58
【问题描述】:

我得到一个Company&lt;IDesignation&gt; 类型的对象。现在我想将它转换为ICompany&lt;Manager&gt;。运行时我知道IDesignation 只不过是“Manager”类型。

【问题讨论】:

  • 纠正我看到输入尖括号的一些问题......公司持有接口类型的具体类型 IDesignation 到接口类型的 ICompany 持有 C# 中管理器的具体类型(铸造这家公司'' 到 ICompany'')
  • 如果你尝试会发生什么?请张贴minimal reproducible example 说明问题所在。
  • 啊,我明白了。听起来您可能想重新设计此类继承。听起来您正处于代码异味的开始阶段,但我可能是错的。我不明白你将如何投射它
  • 请考虑分享一个简单的代码sn-p,否则很难弄清楚组件之间的关系
  • 请看我的例子。我想我猜你在找什么?

标签: c# generics c#-4.0 casting


【解决方案1】:

您需要的是Contravariance,即您的IEntityDelta 泛型类型参数需要是逆变的。 做到这一点并使其发挥作用的唯一方法是:

public interface IEntityDelta&lt;in T&gt; : IEntityDelta where T : IEntity

注意定义中的in T。 查看in (Generic Modifier) (C# Reference)
或者这个Understanding Covariant and Contravariant interfaces in C#

如果您不是该界面的创建者,并且如果定义了 IEntityDelta&lt;&gt; 而没有使用 in 修饰符,那么您就不走运了。

只是提到添加输入/输出修饰符说起来容易做起来难。为此编译您的方法、属性等需要满足 该泛型类型 (T) 参数的逆变条件(或“out”情况下的协方差)。

根据您的信息,这就是您的类和接口的样子(顺便说一句,这很糟糕。下次您需要多花点时间 提供最小但完整的有意义的代码):

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;

【讨论】:

    【解决方案2】:

    这是你要找的吗?

    Company comp = new Company();
    Manager mgner = new Manager(comp.getManager());
    IDesignation manager = mgner; 
    ICompany company = (ICompany)manager;
    

    假设公司是:

    public class Company: ICompany, IDesignation //or something?
    

    使用通用类型转换(您尝试做什么)或简单地转换接口或对象取决于您是显式还是隐式执行此任务(可能类具有预定义的函数来转换它)以及您的评论已经指出......可能是用户或运行时问题,或者是否和/或您需要如何实例化您的对象,所以我真的需要查看类实现,以便能够提供使用类型转换的东西你想要执行它的方式。

    【讨论】:

    • public interface IEntityDelta : IEntityDelta where T : IEntity { } public interface IEntityDelta { //属性集 } public class EntityDelta : IEntityDelta where T : class, IEntity { //具体IEntityDelta 的实现 } public abstract class Entity : IEntity { //IEntity 的抽象实现 } public class Order : Entity { //具体实现 } 我得到类型 EntityDelta // IEntity 的类型是 Order 我需要将其转换为IEntityDelta 并将其传递给另一个服务
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多