WindowsアプリとWebアプリのフォーム上のコントロールにバインドしたり、フォーム側から楽に処理したりできるように、定義したDirectoryオブジェクト用のインターフェイスを実装したクラスを作成していきます。
長くなるので宣言部のみ書きます。大事なとこはちゃんと内部実装を書きます。
最初は DirectoryObject クラス。このクラスはサンプルアプリで扱う Directory オブジェクトの最も基本となるクラスです。
VB
Public MustInherit Class DirectoryObject
Implements IDirectory
'コンストラクタ
'DirectoryEntry を指定して DirectoryObject クラスの新しいインスタンスを初期化します。
Protected Sub New(entry As DirectoryEntry)
'プロパティ
'Directory オブジェクトの種類を取得します。
Public ReadOnly Property Category As CategoryType
'説明を取得または設定します。
Public Property Description As String Implements IDirectory.Description
'関連付けられた DirectoryEntry を取得します。
Public ReadOnly Property Entry As DirectoryEntry Implements IDirectory.Entry
'オブジェクトが破棄されているかどうかを取得します。
Public ReadOnly Property IsDisposed As Boolean Implements IDirectory.IsDisposed
'名前を取得します。
Public Overridable ReadOnly Property Name As String Implements IDirectory.Name
'メソッド
'使用されているリソースを解放します。
Public Sub Dispose() Implements IDisposable.Dispose
'名前を返します。
Public Overrides Function ToString() As String
'使用されているリソースを解放し、オプションでマネージ リソースも解放します。
Protected Overridable Sub Dispose(disposing As Boolean)
C#
public abstract class DirectoryObject : IDirectory
//コンストラクタ
//DirectoryEntry を指定して DirectoryObject クラスの新しいインスタンスを初期化します。
protected DirectoryObject(DirectoryEntry entry)
//プロパティ
//Directory オブジェクトの種類を取得します。
public CategoryType Category
//説明を取得または設定します。
public string Description
//関連付けられた DirectoryEntry を取得します。
public DirectoryEntry Entry
//オブジェクトが破棄されているかどうかを取得します。
public bool IsDisposed
//名前を取得します。
public virtual string Name
//メソッド
//使用されているリソースを解放します。
public void Dispose()
//名前を返します。
public override string ToString()
//使用されているリソースを解放し、オプションでマネージ リソースも解放します。
protected virtual void Dispose(bool disposing)
コンストラクタ内で引数のチェックをしてます。
VB
If entry Is Nothing Then
Throw New ArgumentNullException("entry", "entry が Nothing です。")
End If
If [Enum].TryParse(Of CategoryType)(entry.SchemaClassName, True, _category) = False Then
Throw New ArgumentException("entry の種類が CategoryType に該当しません。", "entry")
End If
C#
if (entry == null)
{
throw new ArgumentNullException("entry", "entry が null です。");
}
if (Enum.TryParse<CategoryType>(entry.SchemaClassName, true, out _category) == false)
{
throw new ArgumentException("entry の種類が CategoryType に該当しません。", "entry");
}
DirectoryEntry.SchemaClassName プロパティの値を CategoryType 列挙体の値に変換できなかったら、サンプルアプリで扱わない Directory オブジェクトとし ArgumentException をスローしてます。
Description プロパティの Get 内はこんな感じ。
VB
If _disposed Then
Throw New ObjectDisposedException(Me.GetType().Name)
End If
Return DirectCast(_entry.Properties.Item("description").Value, String)
C#
if (_disposed)
{
throw new ObjectDisposedException(this.GetType().Name);
}
return (string)_entry.Properties["description"].Value;
DirectoryEntry.Properties プロパティの description 属性の値を返してます。
Set 内はこの値を設定してるので、何か値をセットして例えば更新ボタンクリック時の処理として DirectoryEntry.CommitChanges メソッドを呼び出すと、そのオブジェクトの「説明」が更新されます。