我在 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 日上午 5:39:19
当地时间:2009 年 4 月 13 日上午 11:09:19
按任意键继续。. .
所以它有效,问题是:
当程序调用 IExtensionCollection.Add 和 IExtensionCollection.Detach 方法时,.Net 框架如何调用“附加”和“分离”?填写我在这里遗漏的内部细节。