IExtension:拡張可能オブジェクトパターン:それはどのように動作しますか?
-
09-09-2019 - |
質問
私は、C#で(IExtension、IExtensibleObject)インターフェースを使用して、拡張対象パターンについて探索しました 私は、ローカルおよびその逆からUTCに日付を変換するために非常に単純な例で来ます:
public class BaseObject : IExtensibleObject<BaseObject>
{
private DateTime _startDate;
private ExtensionCollection<BaseObject> _extensions;
public DateTime StartDate
{
get { return _startDate; }
set { _startDate = value; }
}
public BaseObject()
{
StartDate = DateTime.Now;
_extensions = new ExtensionCollection<BaseObject>(this);
}
#region IExtensibleObject<BaseObject> Members
public IExtensionCollection<BaseObject> Extensions
{
get
{
return _extensions;
}
}
#endregion
}
public class DateTimeConverterExtension : IExtension<BaseObject>
{
private BaseObject _owner;
#region IExtension<BaseObject> Members
public void Attach(BaseObject owner)
{
_owner = owner;
_owner.StartDate = owner.StartDate.ToUniversalTime();
}
public void Detach(BaseObject owner)
{
_owner.StartDate = _owner.StartDate.ToLocalTime();
}
#endregion
}
class Program
{
static void Main(string[] args)
{
BaseObject obj = new BaseObject();
Console.WriteLine("Local Time: "+obj.StartDate);
obj.Extensions.Add(new DateTimeConverterExtension());
Console.WriteLine("UTC: "+obj.StartDate);
DateTimeConverterExtension ext = obj.Extensions.Find<DateTimeConverterExtension>();
obj.Extensions.Remove(ext);
Console.WriteLine("Local Time: "+obj.StartDate);
}
}
出力:
現地時間:2009年4月13日午前11時09分19秒AM
UTC:2009年4月13日午前5時39分19秒AM
現地時間:2009年4月13日11時09分19秒AM
何かキーを押すと続行します 。 。ます。
それは動作しますので、質問があります:
どのように.NET Frameworkが「添付」とIExtensionCollection.AddとIExtensionCollection.Detach方法は、プログラムによって呼び出される「デタッチ」を呼び出すのですか?私がここで行方不明です内部の詳細を入力します。
解決
Attach
とDetach
方法はそれぞれ、ExtensionCollection<T>.InsertItem
とExtensionsCollection<T>.RemoveItem
によって呼び出されます。これらのメソッドは、順番に、あなたのコードを呼び出すに終わるものですSynchronizedCollection<T>.Add
とSynchronizedCollection<T>.Remove
、によって呼び出される仮想メソッドです。これは反射するを使用して確認することができます。あなたがIExtensionCollection<T>
の独自の実装を作成した場合、Attach
とDetach
が正しく呼び出されることになるという保証はありません。
所属していません StackOverflow