2009-09-22 37 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

相关问题