2

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

例如:

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

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

  • DirectoryName-"C:\Development\My Solution\My Project\bin\Debug\Testing"
  • Exists-False
  • Extension-""
  • FullName-"C:\Development\My Solution\My Project\bin\Debug\Testing\This is a test"
  • Name-"This is a test"
  • OriginalPath-"Testing\This is a test"

最后一个属性是我最感兴趣的。它是类的Protected属性,IO.FileInfo继承自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.FileSystemInfoPublic属性为从OriginalPath基类读取的。

请注意:我确实有一个接受String值的重载方法,但我实际上正在考虑尝试将其“隐藏”在Private修饰符后面,以便只有FileInfoDirectoryInfo对象可以用于调用此方法。我的主要理由是,如果一个FileInfoDirectoryInfo对象由于字符串中的无效字符(或任何其他原因)而无法实例化,我没有理由调用此方法,我可能能够“清理”代码一点。

无论如何,创建一个真正只用于在这个特定场景中访问这个属性的整个单独的类对于应该至少可以)是一件相当简单的事情来说似乎是一个非常多的开销。不幸的是,我想不出任何其他方法来提取该信息,我只是想知道我是否可能过度思考了这一点。

与此同时,我继续创建了一个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类。

4

1 回答 1

4

创建FileInfoDirectoryInfo对象时输入的路径存储在protected String OriginalPath用于序列化目的的字段和用作内部引用 的内部DisplayPath属性中。

初始化类对象时(参见 .Net 源代码中的Init() 方法),输入的路径同时存储在OriginalPathField 和DisplayPathProperty 中。

这两个类都没有提供公共属性来检索用于创建对象的初始路径。
相反,它们都将DisplayPath属性值作为对 ToString()方法 的覆盖返回:

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

var fInfo = new FileInfo(@"\SomePath\SomeFileName.ext");
string originalPath = fInfo.ToString();
于 2019-10-16T18:11:21.633 回答