我收到一個Company<IDesignation>
類型的對象。現在我想將它投射到ICompany<Manager>
。運行時間我知道IDesignation
不過是「經理」類型。鑄造混凝土<Interface>至界面<concrete>
回答
這是你在找什麼?
Company comp = new Company();
Manager mgner = new Manager(comp.getManager());
IDesignation manager = mgner;
ICompany company = (ICompany)manager;
假設公司是:
public class Company: ICompany, IDesignation //or something?
無論是使用泛型類型轉換(什麼ü正在嘗試做的),或者乾脆投界面或對象取決於你是否會明確或含蓄地(執行此任務也許類有預定義的函數來施放它),並且正如你的評論已經指出的......也許是由用戶或運行時間的事情,或者是否和/或你如何需要實例化你的對象,所以我真的需要看到類實現,以便能夠以您想要執行的方式提供使用類型轉換的內容。
公共接口IEntityDelta
您需要的是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;
- 1. 混凝土類型或界面?
- 2. 鑄造界面
- 3. 春 - 混凝土模型的驗證,同時使用界面
- 4. 混凝土5概要細節頁面
- 5. 鑄造動作<string>至行動<object>
- 6. 鑄造列表<T>至列表<String>類型
- 7. 鑄造清單<Class>至清單<Interface>
- 8. 編輯混凝土塊5
- 9. 用混凝土安裝Bootstrap3.6
- 10. 演算問題 - 混凝土
- 11. 混凝土5。創建
- 12. Symfony混凝土表繼承
- 13. 將混凝土類型澆鑄成普通類型?
- 14. 鑄造IEnumerable <Derived> IEnumerable <BaseClass>
- 15. 泛型方法如何,何時何地使混凝土變爲混凝土?
- 16. Java泛型鑄造<?>
- 17. 鑄造Linq IEnumerable <Datarow>
- 18. 型鑄造EntityCollection <Object>
- 19. ServiceRegistry構造失敗,並拋出ClassCastException混凝土類
- 20. 斯卡拉:延長混凝土類構造函數的參數
- 21. 的Java鑄造<object>表至其接口
- 22. 的jQuery - 混凝土幻燈片
- 23. Selenium IDE:verifyTextPresent在混凝土元素內
- 24. 混凝土5 5.7塊權限
- 25. 混凝土5屬性計數
- 26. 使用Z3混凝土陣列
- 27. 模擬混凝土FileInfo對象
- 28. 混凝土5登錄重定向
- 29. Symfony2,Propel裝置和混凝土繼承
- 30. 混凝土式/通用接口
糾正,因爲我看到了一些問題,鍵入尖括號......具體類型公司持有IDesignation的接口類型進行接口ICompany的型保持具體類型管理器在C# (將該公司''鑄造成ICo mpany'')in C# –
那麼如果你嘗試會發生什麼?請發佈一個顯示問題出在哪裏的[mcve]。 –
啊,我明白了。聽起來你可能想要重寫這個類的繼承。這聽起來像你處於代碼異味的開始階段,但我可能是錯的。我沒有看到你打算怎麼投它 – yardpenalty