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秒点击 UTC:2009年4月13日上午05时39分19秒点击 本地时间:2009年4月13日上午11时09分19秒点击 按任意键继续 。 。
因此,工程,问题是:
如何Net框架调用“附着”和“分离”时IExtensionCollection.Add和IExtensionCollection.Detach方法由程序引用?填写我很想念这里的内部细节。
解决方案
在Attach
和Detach
方法由ExtensionCollection<T>.InsertItem
和ExtensionsCollection<T>.RemoveItem
分别称为,。这些方法,反过来,是由SynchronizedCollection<T>.Add
和SynchronizedCollection<T>.Remove
,这是你的代码最终干什么调入称为虚拟方法。这可以通过使用反射进行验证。如果你创建了自己的实现IExtensionCollection<T>
的,没有保证Attach
和Detach
会被正确地调用。
不隶属于 StackOverflow