2017-03-12 5 views
-4

Company<IDesignation>のオブジェクトを取得しています。今度はそれをICompany<Manager>にキャストしたいと思います。実行時間私はIDesignationが "マネージャ"タイプ以外のものであることを知っています。キャストコンクリート<Interface> to Interface <concrete>

+0

を修正(この会社のをICoにキャストmpany '')in C# –

+1

お試しあればどうなりますか?問題が何であるかを示す[mcve]を投稿してください。 –

+0

ああ、そうです。このクラスの継承を再加工したいと思うような音がします。あなたはコードの匂いの初期段階にいるように聞こえますが、間違っている可能性があります。私はあなたがそれをキャストする方法を見ていません – yardpenalty

答えて

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? 

キャスト(uがやろうとしているもの)、または単にインターフェイスまたはオブジェクトをキャストのいずれかジェネリック型を使用するには、(明示的または暗示的にこのタスクを実行するかどうかに依存しますおそらくクラスにはそれをキャストするための関数があらかじめ定義されています)あなたのコメントが指摘したように...多分ユーザーや実行時の問題、あるいはあなたのオブジェクトをインスタンス化する必要があるかどうか、あなたがそれを実行したい方法で型キャスティングを使用するものを提供できるようにするために実装する必要があります。

+0

パブリックインターフェースIEntityDelta :IEntityDelta T:IEntity {\t }パブリックインターフェイスIEntityDelta {が//特性 のセット} パブリッククラスEntityDelta :IEntityDelta T:クラス、IEntity {\t// IEntityDeltaの具象実装 } 公開抽象クラスエンティティ:IEntity { \t // IEntity 0123の抽象実装} publicクラス受注:エンティティ { //具体的な実装\t } 私はIEntityDelta にキャストし、別のサービスにそれを渡す必要がありEntityDelta // IEntityはタイプ注文 のあるタイプを取得します –

0

必要なものはContravarianceです。つまり、IEntityDeltaジェネリックタイプのパラメータは反復的にする必要があります。 それを行うための唯一の方法と、このために働かなければならないことです。

public interface IEntityDelta<in T> : IEntityDelta where T : IEntity

注意をTで定義で。 あなたがそのインターフェイスの生みの親じゃないとIEntityDelta<>は、W/O in修飾子定義されている場合、あなたは運の出ている場合はin (Generic Modifier) (C# Reference)
またはこのUnderstanding Covariant and Contravariant interfaces in C#

をチェックしてください。

また、修飾子の追加は完了したよりも簡単であることに言及してください。あなたのメソッドをコンパイルするためには、プロパティなどは、その汎用タイプ(T)パラメータの逆分散(または「外」の場合の共分散)の条件を で満たす必要があります。

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 { } 

そして、あなたのクラスは、インタフェースがあなたの情報に基づいてどのように見えるか、これは(。ところでひどいものでした次回は、理にかなって、最小限のが、完全なコードを提供してもう少し時間 を捧げるする必要があります)

...と使用方法:私はC#でマネージャーの具体的な種類を保持ICompanyのタイプをインターフェイスに角括弧...... IDesignationのインターフェイスタイプを持株会社の具体的な種類を入力していくつかの問題を見るように

var order = new Order(); 
EntityDelta<IEntity> orderDelta = new EntityDelta<IEntity>(order); 
IEntityDelta<IEntity> idelta = orderDelta; 
IEntityDelta<Order> iOrderDelta = orderDelta; 
関連する問題