2009-09-22 30 views
0

我得到了該行的代碼,它是越來越重複了很多你會如何改寫這行代碼,以便更爲通用

myString = If(myObj1.myProp Is Nothing, "", If(want = "abr", myObj1.myProp.abr, myObj1.myProp.desc)) 

該行x ñ,只是改變「myObj1」到「 什麼 「和」 myProp 「到」 什麼

我想這

Public Function getDesc(Of t)(ByVal obj As t) As String 
    Return If(obj Is Nothing, "", If(want = "abr", obj.abr, obj.Desc)) 
End Function 

這裏的問題是牛逼不知道它有ABR/遞減性能

+0

你能解釋一點myProp,want,abr和desc是什麼? myProp和Prefix之間有任何關係嗎? –

+0

@ Meta-Knight,修復了我的示例代碼 – Fredou

回答

4

創建的方法,並通過可變的部分作爲參數。

這樣創建方法,以便該方法知道T具有這些特定屬性。對泛型進行約束(定義T應該繼承某些定義了這些屬性的接口)。

在C#中,你可以這樣做。 (它也可以在VB.NET中完成,但我不知道語法)。

public string GetDesc<T> (T obj) where T : ISomeInterface 
{ 
    if(obj == null) 
    return String.Empty; 

    if(obj.abr == ...) 
    ... 
} 

接口'ISomeInterface'應該定義abr和Desc屬性。 您還必須確保您在方法調用中使用的類型實現此接口,否則您將收到編譯錯誤。

我相信,在VB.NET,它會看起來像部份:

Public Function getDesc(Of t As ISomeInterface)(ByVal obj As t) As String 
    Return If(obj Is Nothing, "", If(want = "abr", obj.abr, obj.Desc)) 
End Function 
0

的方法是要走的路。然後,您可以用程序名稱替換程序中的這一行代碼並傳入相關參數。還意味着如果您將來需要更改此代碼行,則只需在方法內部更改該代碼,而不是代碼中出現該代碼的每個點。

1

您可以創建用於與縮寫符號及說明,像所有的類接口:

Public Interface IObjectWithDescription 

    Property Abreviation As String 
    Property Description As String 

End Interface 

然後實現與這些屬性的所有對象的接口。然後,你可以有:

Public Function getDesc(ByVal obj As IObjectWithDescription, want As String) As String 
    Return If(obj Is Nothing, "", If(want = "abr", obj.Abreviation, obj.Description)) 
End Function 

我建議你找到的接口一個更好的名字,雖然,我不知道您的問題足夠的細節,以找到一個;-)

+0

如果對象是來自linq2sql的entityref,該怎麼辦? – Fredou

相關問題