【问题标题】:IExtension : extensible object pattern : How does it work?IExtension:可扩展对象模式:它是如何工作的?
【发布时间】:2009-04-13 05:42:25
【问题描述】:

我在 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 框架如何调用“附加”和“分离”?填写我在这里遗漏的内部细节。

【问题讨论】:

    标签: c# .net design-patterns extensibility


    【解决方案1】:

    AttachDetach 方法分别由 ExtensionCollection&lt;T&gt;.InsertItemExtensionsCollection&lt;T&gt;.RemoveItem 调用。反过来,这些方法是由SynchronizedCollection&lt;T&gt;.AddSynchronizedCollection&lt;T&gt;.Remove 调用的虚拟方法,这是您的代码最终调用的方法。这可以通过使用Reflector 来验证。如果您创建了自己的 IExtensionCollection&lt;T&gt; 实现,则无法保证正确调用 AttachDetach

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      相关资源
      最近更新 更多