65.9K
CodeProject 正在变化。 阅读更多。
Home

泛型动态装饰器

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2011年7月22日

CPOL

2分钟阅读

viewsIcon

14946

downloadIcon

144

通用动态装饰器通过使用 .NET 泛型增强了动态装饰器,使其具有强类型。

通用动态装饰器通过使用 .NET 泛型增强了 动态装饰器,使其具有强类型。

如您可能已经知道,使用 ObjectProxyFactory.CreateProxy 创建代理时,需要将其转换为特定的接口类型,以便将额外的行为附加到该接口的方法上。问题是,如果转换为错误的接口类型,代码可以通过编译,甚至可以执行,直到您使用它来调用方法。然后,它会生成运行时错误。

使用通用动态装饰器,ObjectProxyFactory.CreateProxy<T> 返回一个强类型的接口。不再需要进行动态转换。如果指定了错误的接口类型,代码可以通过编译,但在您有机会使用该接口调用方法之前,会在创建代理期间生成运行时错误。

以下代码演示了如何使用通用动态装饰器将进入日志添加到类 Employee 的对象 emp 的方法 DetailsByLevel 中。

static void Main(string[] args)
{
    IEmployee emp = new Employee(1, "John", "Smith", new DateTime(1990, 4, 1), 1);
    System.Int32? id = null;
    System.String detail = "";
 
    emp = ObjectProxyFactory.CreateProxy<IEmployee>(
        emp,
        new String[] { "DetailsByLevel" },
        new Decoration((x, y) =>
        {
            IMethodCallMessage method = x.CallCtx;
            string str = "Calling " + x.Target.GetType().ToString() + 
				"." + method.MethodName +
                "(";
            int i = 0;
            foreach (object o in method.Args)
            {
                if (i > 0)
                    str = str + ", ";
                str = str + o.ToString();
            }
            str = str + ")";
 
            Console.WriteLine(str);
            Console.Out.Flush();
        }, null),
        null);
 
    id = emp.DepartmentID;
    detail = emp.DetailsByLevel(2);
}

有关使用动态装饰器扩展对象功能的更多信息,请参阅文章 动态装饰器模式

有关可用于编写对象强大方面功能的示例和特性,请参阅文章 使用动态装饰器添加方面

有关在应用程序开发中一般使用动态装饰器的原则,请参阅文章 组件、方面和动态装饰器

有关在 ASP.NET 应用程序中使用动态装饰器,请参阅文章 ASP.NET 应用程序的组件、方面和动态装饰器

有关在 ASP.NET MVC 应用程序中使用动态装饰器,请参阅文章 ASP.NET MVC 应用程序的组件、方面和动态装饰器

有关在 Silverlight/WCF 应用程序中使用动态装饰器,请参阅文章 Silverlight / WCF 服务应用程序的组件、方面和动态装饰器

有关在 MVC/AJAX/REST 应用程序中使用动态装饰器,请参阅文章 MVC/AJAX/REST 应用程序的组件、方面和动态装饰器


修改于 2011 年 7 月 21 日星期四 下午 12:16

© . All rights reserved.