我使用在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方法由程序引用?填写我很想念这里的内部细节。

有帮助吗?

解决方案

AttachDetach方法由ExtensionCollection<T>.InsertItemExtensionsCollection<T>.RemoveItem分别称为,。这些方法,反过来,是由SynchronizedCollection<T>.AddSynchronizedCollection<T>.Remove,这是你的代码最终干什么调入称为虚拟方法。这可以通过使用反射进行验证。如果你创建了自己的实现IExtensionCollection<T>的,没有保证AttachDetach会被正确地调用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top