2013-06-07 2 views
0

Я использую специальный класс для передачи данных между методами. Одной из основных функций является обработка изображений, поэтому у меня есть путь к изображению и пользовательский путь пальца в качестве свойств моего класса. Я хочу использовать методы, включенные в класс System.IO.Path, как часть свойств, но я не могу это сделать.Почему я не могу объявить свойство как System.IO.Path

Я знаю, как заставить это работать, используя тип string вместо System.IO.Path как тип, поэтому мне не нужно никому говорить мне, как это сделать. Я просто думаю, что возможность объявить мой ImagePath как System.IO.Path будет намного проще, потому что я могу использовать методы Path на свой ImagePath. Мне нужно упустить некоторое понимание об объявлении типов, и я надеюсь, что смогу научиться этому вопросу.

Как класс определяется:

Public Class myClass 
    'structured information which will be passed to a replicator 

    Public Property ID As Integer 
    Public Property ImagePath As System.IO.Path '<== this doesn't work 
    Public Property ThumbPath As System.IO.Path '<== this doesn't work 
    Public Property GroupID As Byte 
    Public Property SystemID As Byte 
    Public Property Comment As String 
    'Other properties 
End Class 

Как я хотел бы использовать этот класс:

Public Function myReplicatorFunc(myObj as myClass) 
    Dim myTempPath as string 
    Dim myDBObj as myDBConnection 

    'handle database connections 

    myTempPath = myObj.ImagePath.GetDirectoryName() & "\" _ 
     myDBObj.GetIntID.toString() & "\" _ 
     myObj.ImagePath.GetExtension() 

    My.Computer.FileSystem.RenameFile(myObj.ThumbPath.toString, myTempPath) 

    'Other file movements for replication etc 
End Function 

Почему я не могу объявить свойство как класс System.IO.Path? Если по какой-либо причине ответ просто «НЕТ» (пожалуйста, объясните, почему), то как я могу использовать методы System.IO.Path как расширения для моих свойств без повторной записи в качестве пользовательского класса с точной копией тех же методов?

ответ

6

Вы не можете объявить экземпляр System.IO.Path, потому что это статический класс - он не может быть создан. Подумайте, что это просто группировка глобальных функций, связанных с путями, в пространстве имен System.IO.Path. (Реальное пространство имена просто System.IO, но потому, что Path статический класс, функционально он действительно ведет себя так, как будто просто пространство имен для связки соответствующих глобальных функций.)

Вашего ImagePath свойства должно быть string и вам просто нужно передайте его на Path, если вам нужна эта логика. Это несколько прискорбно.

В качестве альтернативы, вы можете создать новый класс (извините, C# код, я не эксперт VB.NET):

using System; 
using System.IO; 
// import namespaces as necessary 

public class Filename 
{ 
    private string m_sFilename; 

    public Filename (string sFilename) 
    { 
     m_sFilename = sFilename; 
    } 

    public string FullName 
    { 
     get 
     { 
      return (m_sFilename); 
     } 
     set 
     { 
      m_sFilename = value; 
     } 
    } 

    public string FolderName 
    { 
     get 
     { 
      return (Path.GetDirectoryName (m_sFilename)); 
     } 
    } 

    // Add more properties/methods 
    ... 
} 

После того, как у вас есть этот класс, вы можете написать:

В моем проекте я сделал почти то же самое, потому что наличие определенного типа для путей к папке/файлу упрощает обновление логики, связанной с операциями над именами путей.

+0

Я могу построить этот класс в VB.NET нет проблем. Задав вопрос, я подумал, что это самый простой способ сделать это. Я надеялся, что это будет более автоматическим, но, увы, я, видимо, не смогу купить пирог и съесть его. Благодарим вас за объяснения различий между классом и пространством имен. – turbonate

+0

@turbonate Да, я согласен с вами - было бы лучше, если бы было легче сделать это; Я нахожу это обходное решение немного неуклюжим. Я рад, что это помогло - спасибо за голосование. – xxbbcc

1

Почему бы не использовать DirectoryInfo как:

Public Property ImagePath As System.IO.DirectoryInfo 
Public Property ThumbPath As System.IO.DirectoryInfo 
+0

Это почти работает, я мог бы наследовать этот класс в сочетании с тем, что предлагает xxbbcc. Единственная проблема заключается в том, что 'System.IO.DirectoryInfo' не имеет' GetExtension' и 'GetFileName', так как это класс каталога, а не полный файловый операционный класс. – turbonate