你会如何重写这行代码更通用

时间:2009-09-22 14:47:29

标签: vb.net generics

我得到了那行代码而且它重复了很多次

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

第x行 n ,只需将“ 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

这里的问题是 t 不知道它有 abr / desc 属性

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

我建议您找到一个更好的界面名称,但我不知道有关您的问题的足够详细信息,以找到一个; - )

答案 2 :(得分:0)

方法是要走的路。然后,您可以使用方法名称替换程序中的这行代码并传入相关参数。同样意味着如果您需要在将来的某个时间更改此行代码,您只需在方法内更改它,而不是在代码中出现该行的每个位置。