«Лучший» способ доступа к IO.FileInfo Защищенное свойство (OriginalPath)? - PullRequest
2 голосов
/ 16 октября 2019

Я работаю над серией методов, которые будут проверять данный путь, чтобы определить, является ли он (или, по крайней мере, может быть ) допустимым. У меня есть пара перегрузок, которые принимают либо объект 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.FileSystemInfo со свойством Public для OriginalPath, который читает из базового класса.

ОБРАТИТЕ ВНИМАНИЕ: I * 1062У * do есть метод перегрузки, который принимает значение 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 объект, чтобы я мог получить доступ к своему "custom "OriginalPath свойство. Это единственный способ, который я нашел до сих пор, чтобы «добраться отсюда», но я хотел бы продолжить и спросить здесь, если есть другие предложения или вещи, которые я мог бы пропустить.

Единственное "«Изящество экономии» для этого метода реализации заключается в том, что, поскольку «пользовательские» TempFileInfo, стандартные IO.FileInfo и стандартные IO.DirectoryInfo классы все наследуют от класса IO.FileSystemInfo, я должен иметь возможность просто создатьперегруженный Widening Operator метод для преобразования как IO.FileInfo объектов, так и IO.DirectoryInfo объектов вместо необходимости создавать отдельный класс TempDirInfo.

1 Ответ

4 голосов
/ 16 октября 2019

Путь, введенный при создании объекта FileInfo или DirectoryInfo , сохраняется в поле protected String OriginalPath, которое используется для целей сериализации, и внутреннем DisplayPath *. 1007 * свойство, которое используется как внутренняя ссылка.

Когда объект класса инициализируется (см. Метод Init () в исходном коде .Net), введенный путь сохраняется как в поле OriginalPath, так и в DisplayPath. Свойство.

Оба класса не предоставляют открытое свойство для извлечения начального пути, использованного для создания объекта.
Вместо этого они оба возвращают значение свойства DisplayPath как переопределение ToString() метод:

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

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