2017-01-04 18 views
2

我Dynamics CRM中(這在技術上是這裏的問題無關,但一些背景故事的解釋這個問題)工作的派生類型。有許多類型都是從類Entity的。我想創建一個Class<T>() : where T: Entity,但有進一步的限制,它只能從Entity派生類的具體工作。如何最好地限制通用<T>類,其中,所有來自同一個基類

我現在這樣做的方法是有一個enum匹配我想用,if/else if/else我通過這些類型throw方式,如果無效類型傳入的實體名稱。

感覺笨拙,我覺得我會過得更好寫一些像

public class ProductConverter<t> where T: Entity (OpportunityProduct, QuoteProduct, AccountProduct) { ... }

這樣類型的發動機可以說,「我們正在研究一個基類實體,同時我們只是努力這些派生類型的實體「。

我希望這可以讓我明白我在做什麼 - 我的目的是創建一個引擎來處理Entity Records之間的轉換,可以在不必重新編寫大塊代碼的情況下進行擴展(實際上,添加一個映射和類型參數)。我相信有更好的方法來做到這一點,所以請指出,如果你看到他們:)

edit @ henk-holterman問我是否可以改變類。因爲他們正在生成的類文件,作爲對動態CRM Web服務的接口,這是不可能的。

edit 正如@jamiec指出,這些類partial,所以我可以通過我希望修改的特定的類定義接口做到這一點。

+1

你可以改變實體類嗎?添加一個界面?爲什麼沒有'Product'基類? –

+0

不,它們是作爲系統接口自動生成的,我對此有限制。我會更新這個問題。 –

+0

只是使用'typeof'來測試類的類型,那麼你可以使用switch語句並抽象出每種類型。 – bilpor

回答

4

你自動生成的類幾乎肯定是partial,這意味着你應該爲每個單獨的文件實現共享接口

public partial class QuoteProduct : IProduct 
{ // probably empty } 

然後你就可以通過界面限制你的泛型類型:

public class ProductConverter<T> where T: Entity, IProduct 
{ // your implementation } 
+0

感謝你的幫助 - 正如你所提到的那樣,它們是「部分」的,這樣轉換器就可以很好地與接口一起工作。該界面還允許我通用其他一些轉換要求,我想知道如何做到最好,所以一切運行良好。 –

+1

@PeterStreet酷,很高興我可以幫助一個輕浮/一次性評論。有時你錯過了樹木;) – Jamiec

+0

[橡皮鴨調試](https://en.wikipedia.org/wiki/Rubber_duck_debugging)與鴨堆棧溢出;) –

0

您需要實現一個接口,然後從您要使用的每類中實現。這可能看起來像這樣:

public interface IProduct 
{ 
    int ProductId {get;set;} 
} 

public class ProductConverter<t> where T: Entity, IProduct 
{ 
    //Do sth. with your ProductId 
} 

因爲您的類是根據您在評論中描述的方式生成的,所以在您的特例中不起作用。那麼你只有使用類型檢查的能力:

T obj; 
if (obj.GetType() == typeof(YourClass)) 

//OR 

if (obj is YourClass) 

問題是如果你做某事。就像你在你的問題中期待的那樣,你的變量是無用的,因爲你不知道它是哪種類型。

public void ProductConverter<t>(T obj) where T: Entity (OpportunityProduct, QuoteProduct) 
{ 
    obj. //What to do here?? It can hold Methods from both OpportunityProduct or QuoteProduct 
} 

所以實際上你有可能推廣你所需要的東西或者進行類型檢查。

如果你知道會發生什麼,也許在dynamic關鍵字可以幫助你。在這種情況下,您不需要通用方法。例如,這可能看起來像這樣:

public void ProductConverter(dynamic entity) 
{ 
    //Make sure the method exists. Or you will get an Exception. 
    //The compiler can't warn you about this 
    entity.SomeMethod1(); 
    entity.SomeMethod2(); 
} 

不知道如果這可以真正幫助你,如果你想寫一個轉換器。

+0

感謝你。我沒有注意到生成的類是「partial」,這將使我可以將我自己的類附加到這個上面......愚蠢的我沒有注意到,但是對於生成的代碼我是盲目的。這樣,我可以直接在每個類上實現轉換方法來生成其他類,而不用擔心碰撞。 –

+1

@PeterStreet很高興聽到您找到了解決方案。 – Sebi

+0

我也是,謝謝你的幫助:) –

相關問題