我在VS 2012中编写了一个程序,默认目标是.Net 4.5,后来被问到什么是绝对最小的.Net版本。重新定位4.0没有出现任何错误,尽管3.5和早期版本最初看起来并不那么兼容。但我肯定知道我没有使用任何“基本”的新功能,因为我刚从VS 2005开始(好吧,也许有几个LINQ语句可以很容易地转换成循环)。换句话说,这些“新”功能都没有超出“语法/运行时糖”,如果只有微软想要或者可以手动实现,那么可以在早期的.Net版本中实现。
最常用的功能是:
我想知道是否可以以不需要重写原始代码的方式扩展系统类,并保持与新.Net版本的兼容性。
我尝试添加部分类定义:
#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(...)
,但仍在寻找替代解决方案。
由于版本4.0之前的.Net没有为Type类实现“=”运算符,因此无法在Select Case
(switch
)构造中使用它。所以我再次尝试:
#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版本保留新的和易读的风格?
答案 0 :(得分:1)
您不能使用partial类来扩展其他程序集中的类 部分类纯粹是语法特征。
您创建了一个名为System.Type
的全新类,它与原始System.Type
无关。
不要那样做。