"Best" 访问方式 IO.FileInfo 受保护 属性 (OriginalPath)?

"Best" way to access IO.FileInfo Protected property (OriginalPath)?

我正在研究一系列方法,这些方法将测试给定路径以确定它是否(或者,至少 可能 )有效。我有几个重载可以接受 IO.FileInfo 对象或 IO.DirectoryInfo 对象——我个人更喜欢用它来帮助在过程中尽快捕获无效字符。作为流程的一部分,我 "need" 获得的一条信息基本上是用户提供的原始值 - 特别是 IO.FileInfoIO.DirectoryInfo 对象,因为它们会自动将 Environment.CurrentDirectory 值添加到它确定为相对路径的任何字符串之前。

例如:

Dim TestFile As New IO.FileInfo("Testing\This is a test")

实例化具有以下属性(以及其他属性)的 IO.FileInfo 对象:

最后这个属性是我最感兴趣的,是IO.FileInfoclass的Protected属性,继承了来自 IO.FileSystemInfo class,但这似乎是检索传递给 IO.FileInfo 构造函数的原始值的最佳方法。显然,我无法使用简单的 Dim TestPath As String = TestFile.OriginalPath 直接访问 属性 - IDE 显示错误“'System.IO.FileSystemInfo.OriginalPath' is not accessible in this context because it is 'Protected'” - 所以我只能想出一种方法来获取这条特定的信息:创建一个 全新的 class 继承 IO.FileSystemInfoPublic 属性 对于从基数 class 读取的 OriginalPath

请注意:我确实有一个接受String值的重载方法,但实际上我想尝试"hide" 那一个在 Private 修饰符后面,这样只有 FileInfoDirectoryInfo 对象可以用来调用这个方法。我的主要推理是,如果 FileInfoDirectoryInfo 对象由于字符串中的无效字符(或任何其他原因)而无法实例化,我没有理由调用此方法我也许可以 "clean up" 一点代码。

无论如何,创建一个完全独立的class,实际上只会用于访问这个一个属性在这个一个 特定场景似乎是一个非常简单的开销,应该(或者至少可以)事物。不幸的是,我想不出任何其他方法来提取该信息,我只是想知道我是否想得太多了。

与此同时,我已经创建了一个 TempFileInfo class 用于测试(注意:我还没有实际测试它 ) 没有为任何常规 Public 属性显式实现任何 "custom" 代码(从 IO.FileSystemInfo class 继承时需要):

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,它应该允许我从 "regular" IO.FileInfo 对象转换为我的 TempFileInfo 对象,这样我就可以访问我的 "custom" OriginalPath 属性。这是迄今为止我找到的 "get there from here" 的唯一方法,但我想继续在这里询问,以防有其他建议或我可能忽略的事情。

这种实现方法唯一的"saving grace"是,因为"custom"TempFileInfo,标准IO.FileInfo,标准IO.DirectoryInfoclasses 都继承自 IO.FileSystemInfo class,我应该能够简单地创建一个重载的 Widening Operator 方法来转换 IO.FileInfo 对象以及 IO.DirectoryInfo 对象,而不必创建单独的 TempDirInfo class.

FileInfo or DirectoryInfo object is created is stored in the protected String OriginalPath field - which is used for serialization purposes - and the internal DisplayPath属性时输入的路径,作为内参。

初始化class对象时(见.Net源码中的Init() method),输入的路径同时存储在OriginalPath字段和[=14]字段中=] 属性。

两个 classes 都不提供 public 属性 来检索用于创建对象的初始路径。
相反,它们都 return DisplayPath 属性 值作为 override to the ToString() 方法:

Dim fInfo = New FileInfo("\SomePath\SomeFileName.ext")
Dim originalPath = fInfo.ToString()

var fInfo = new FileInfo(@"\SomePath\SomeFileName.ext");
string originalPath = fInfo.ToString();