扩展.Net系统类,以便将较新的功能向后移植到旧平台?

时间:2012-12-05 17:09:05

标签: .net

我在VS 2012中编写了一个程序,默认目标是.Net 4.5,后来被问到什么是绝对最小的.Net版本。重新定位4.0没有出现任何错误,尽管3.5和早期版本最初看起来并不那么兼容。但我肯定知道我没有使用任何“基本”的新功能,因为我刚从VS 2005开始(好吧,也许有几个LINQ语句可以很容易地转换成循环)。换句话说,这些“新”功能都没有超出“语法/运行时糖”,如果只有微软想要或者可以手动实现,那么可以在早期的.Net版本中实现。

最常用的功能是:

  • Enumerable.First / Enumerable.Single
  • String.IsNullOrWhiteSpace
  • operator =(System.Type,System.Type)
  • 我想知道是否可以以不需要重写原始代码的方式扩展系统类,并保持与新.Net版本的兼容性。

    取1. String.IsNullOrWhiteSpace

    我尝试添加部分类定义:

    #If DotNet < "4.0" Then
    
    Namespace Global.System
    
        <Serializable> _
        <Runtime.InteropServices.ComVisible(True)> _
        Partial Public NotInheritable Class [String]
            Inherits Object
    
            Public Shared Function IsNullOrWhiteSpace(ByVal sText As String) As Boolean
                Return String.IsNullOrEmpty(sText) OrElse String.IsNullOrEmpty(sText.Trim)
            End Function
    
        End Class
    
    End Namespace
    
    #End If
    

    这绝对没有效果。我知道,可以在任意类中定义这样的函数,然后将其称为StringUtil.IsNullOrWhiteSpace(...),但仍在寻找替代解决方案。

    取2. operator =(System.Type,System.Type)

    由于版本4.0之前的.Net没有为Type类实现“=”运算符,因此无法在Select Caseswitch)构造中使用它。所以我再次尝试:

    #If DotNet < "4.0" Then
    
    Namespace Global.System
    
        <Serializable> _
        Partial Public MustInherit Class [Type]
            Inherits Reflection.MemberInfo
    
            Public Shared Operator =(ByVal oType1 As Type, ByVal oType2 As Type) As Boolean
                Return oType1 Is oType2
            End Operator
    
            Public Shared Operator <>(ByVal oType1 As Type, ByVal oType2 As Type) As Boolean
                Return oType1 IsNot oType2
            End Operator
    
        End Class
    
    End Namespace
    
    #End If
    

    它也没有帮助,但确实有一些额外的效果:当隐藏此块时,只有“Operator'='没有为类型'System.Type'和'System.Type'定义”编译器错误是显示,但然后它出现,然后出现其他错误,例如“'IsEnum'不是'System.Type'的成员”,我最喜欢的“类型'System.Type'的值不能转换为'System.Type “”。怎么可能同时用我的部分定义替换真正的System.Type,但仍然没有看到“=”和“&lt;&gt;”运算符定义?

    是的,我知道,我可以恢复过时的风格:

    Select Case True
        Case Is TypeOf obj Is t1
            ' ...
        Case Is (TypeOf obj Is t2) OrElse (TypeOf obj is t3)
            ' ...
    End Select
    

    但这真的很难看,而且我总是讨厌它。有没有办法用旧的.Net版本保留新的和易读的风格?

    1 个答案:

    答案 0 :(得分:1)

    您不能使用partial类来扩展其他程序集中的类 部分类纯粹是语法特征。

    您创建了一个名为System.Type的全新类,它与原始System.Type无关。
    不要那样做。