我正在研究一系列方法,这些方法将测试给定路径以确定它是否(或至少可能(有效。我有几个重载可以接受IO.FileInfo
对象或IO.DirectoryInfo
对象 - 我个人更喜欢使用它来帮助在此过程中尽快捕获无效字符。作为流程的一部分,我"需要"获得的一条信息基本上是用户呈现的原始值 -特别是在IO.FileInfo
或IO.DirectoryInfo
对象的情况下,因为它们会自动将Environment.CurrentDirectory
值附加到它确定为相对路径的任何字符串。
例如:
Dim TestFile As New IO.FileInfo("TestingThis is a test")
使用以下属性(以及其他属性(实例化IO.FileInfo
对象:
DirectoryName
-"C:DevelopmentMy SolutionMy ProjectbinDebugTesting"
Exists
-False
Extension
-""
FullName
-"C:DevelopmentMy SolutionMy ProjectbinDebugTestingThis is a test"
Name
-"This is a test"
OriginalPath
-"TestingThis is a test"
最后一个属性是我最感兴趣的属性。它是IO.FileInfo
类的Protected
属性,继承自IO.FileSystemInfo
类,但它似乎是检索传递给IO.FileInfo
构造函数的原始值的最佳方法。显然,我不能用一个简单的Dim TestPath As String = TestFile.OriginalPath
直接访问该属性 - IDE 显示错误">'System.IO.FileSystemInfo.OriginalPath' is not accessible in this context because it is 'Protected'
" - 所以我只能想到一种方法来获取这条特定信息:创建一个全新的类,该类继承IO.FileSystemInfo
,Public
属性用于从基类读取的OriginalPath
。
请注意:我确实有一个接受String
值的重载方法,但我实际上正在考虑尝试将该方法"隐藏"在Private
修饰符后面,以便只有FileInfo
和DirectoryInfo
对象可用于调用此方法。我的主要理由是,如果FileInfo
或DirectoryInfo
对象由于字符串中的无效字符(或任何其他原因(而无法实例化,我没有理由调用此方法,我可能能够"清理"代码一点。
无论如何,创建一个完全独立的类,实际上只用于在这个特定场景中访问这一个属性,对于应该(或者至少可以(相当简单的事情来说,这似乎是非常多的开销。不幸的是,我想不出任何其他方法来提取这些信息,我只是想知道我是否可能想多了。
与此同时,我继续创建了一个用于测试的TempFileInfo
类(注意:我还没有实际测试过它(,而没有为任何常规Public
属性显式实现任何"自定义"代码(从IO.FileSystemInfo
类继承时需要(:
Private Class TempFileInfo
Inherits IO.FileSystemInfo
Public Overrides ReadOnly Property Name As String
Get
Throw New NotImplementedException()
End Get
End Property
Public Overrides ReadOnly Property Exists As Boolean
Get
Throw New NotImplementedException()
End Get
End Property
Public Overrides Sub Delete()
Throw New NotImplementedException()
End Sub
Public Shadows ReadOnly Property OriginalPath As String
Get
Return MyBase.OriginalPath
End Get
End Property
Public Shared Widening Operator CType(v As FileInfo) As TempFileInfo
Dim FSI As FileSystemInfo = v
Return CType(FSI, TempFileInfo)
End Operator
End Class
您会注意到,我还包含一个Widening Operator
,它应该允许我从"常规"IO.FileInfo
对象转换为我的TempFileInfo
对象,以便我可以访问我的"自定义"OriginalPath
属性。这是到目前为止我找到的"从这里到达那里"的唯一方法,但我想继续在这里询问,以防有其他建议或我可能忽略的事情。
这种实现方法的唯一"节省恩典"是,因为"自定义"TempFileInfo
、标准IO.FileInfo
和标准IO.DirectoryInfo
类都继承自IO.FileSystemInfo
类,我应该能够简单地创建一个重载的Widening Operator
方法来转换IO.FileInfo
对象和IO.DirectoryInfo
对象,而不必创建单独的TempDirInfo
类。
创建 FileInfo 或 DirectoryInfo 对象时输入的路径存储在protected String OriginalPath
字段中(用于序列化目的(和内部 DisplayPath 属性(用作内部引用(。
初始化类对象时(请参阅 .Net 源代码中的 Init(( 方法(,输入的路径存储在OriginalPath
字段和DisplayPath
属性中。
这两个类都不提供公共属性来检索用于创建对象的初始路径。
相反,它们都返回DisplayPath
属性值作为对 ToString(( 方法的重写:
Dim fInfo = New FileInfo("SomePathSomeFileName.ext")
Dim originalPath = fInfo.ToString()
var fInfo = new FileInfo(@"SomePathSomeFileName.ext");
string originalPath = fInfo.ToString();