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