2017-03-12 57 views
-4

我收到一個Company<IDesignation>類型的對象。現在我想將它投射到ICompany<Manager>。運行時間我知道IDesignation不過是「經理」類型。鑄造混凝土<Interface>至界面<concrete>

+0

糾正,因爲我看到了一些問題,鍵入尖括號......具體類型公司持有IDesignation的接口類型進行接口ICompany的型保持具體類型管理器在C# (將該公司''鑄造成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? 

無論是使用泛型類型轉換(什麼ü正在嘗試做的),或者乾脆投界面或對象取決於你是否會明確或含蓄地(執行此任務也許類有預定義的函數來施放它),並且正如你的評論已經指出的......也許是由用戶或運行時間的事情,或者是否和/或你如何需要實例化你的對象,所以我真的需要看到類實現,以便能夠以您想要執行的方式提供使用類型轉換的內容。

+0

公共接口IEntityDelta :IEntityDelta其中T:IEntity {\t } 公共接口IEntityDelta { //設置屬性 的} 公共類EntityDelta :IEntityDelta其中T:類,IEntity { \t// IEntityDelta的具體實現 } 公共抽象類實體:IEntity { \t //抽象實現IEntity } 公共類訂單:實體 { \t //具體實現 } 我得到的類型EntityDelta // IEntity是Order類型 我需要將其轉換爲IEntityDelta 並將它傳遞給另一個服務 –

0

您需要的是Contravariance,即您的IEntityDelta泛型類型參數需要作逆變。 做到這一點,對於這項工作的唯一方法是有:

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

注意T中的定義。 退房in (Generic Modifier) (C# Reference)
或者這Understanding Covariant and Contravariant interfaces in C#

如果你是該接口不的創造者,如果IEntityDelta<>定義W/O的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;