我正在研究使用 DynamicProxy 类,我对这个概念还很陌生。在我走得太远之前,我想知道这些类与 IntelliSense 和类型安全的配合如何?
我只是害怕使用Castle DynamicProxy(或其他一些)之类的东西,并且在设置完所有内容后发现使用我的对象不提供 IntelliSense 或类型安全。任何人都可以对此有所了解吗?
我正在研究使用 DynamicProxy 类,我对这个概念还很陌生。在我走得太远之前,我想知道这些类与 IntelliSense 和类型安全的配合如何?
我只是害怕使用Castle DynamicProxy(或其他一些)之类的东西,并且在设置完所有内容后发现使用我的对象不提供 IntelliSense 或类型安全。任何人都可以对此有所了解吗?
我正在寻找有关如何使用 DynamicProxy 类的直接答案,以及它们是否支持智能感知,如果支持……如何?
好吧,在解释DynamicProxy 类如何工作时,您将清楚地了解它们为什么是类型安全的,以及它们如何能够如此出色地与智能感知一起工作。
首先,让我们了解一下 DynamicProxy 实际上是什么。代理类是代表另一个类处理成员调用的类。这可以通过继承(最常见)或通过组合来完成。所以,如果你要手写一个代理类,它可能看起来像这样:
public class Customer
{
public virtual string Name { get; set; }
// etc...
}
public class CustomerProxy : Customer
{
public override string Name
{
get
{
// Do additional functionality...
return base.Name;
}
set
{
// Do additional functionality...
base.Name = value;
}
}
}
两 (2) 个关键特性在此正常工作中起着至关重要的作用,即继承和多态性。因此,要Customer
无缝使用该类,aProxyGenerator
只需创建CustomerProxy
该类的一个实例,但将其作为Customer
. 它基本上与做相同的事情Customer customer = new CustomerProxy();
。“动态”部分实际上与 .NET 关键字没有任何关系dynamic
,而应改为“运行时”,因为它仅表示代理类是在运行时(在应用程序运行时)生成的,而不是在编译时。哦,如果你想知道它是如何做到的,它使用System.Reflection.Emit
这就是 a 的简单版本DynamicProxy
。在创建这些代理类时,不同的框架提供不同的功能。例如,在 Castle Windsor 的 DynamicProxy 中,可以创建 Mixins 并为这些代理类应用额外的接口——也就是说,您生成的代理类可能看起来像这样:public class CustomerProxy : Customer, ISomeInterface { ... }
,即使Customer
该类本身没有实现ISomeInterface
. 这是 Castle 的 DynamicProxy ( http://kozmic.net/dynamic-proxy-tutorial/ ) 的一个非常好的资源。它介绍了这些功能的各种功能和用例。
它是并且类型安全的,因此智能感知应该可以正常工作。看这个例子:DynamicProxy 教程
您可以看到他们使用泛型来实例化代理类。这意味着它是完全键入的,因此您无需担心。
代理可以被视为调用拦截器(取决于代理实现的类型),因此当您编写代码时,就像您正在使用已定义的接口或类一样,因此您将获得 intelliSense。
然后,根据您对类/接口成员实现“一些”调用的代理类型,将被拦截。
[编辑]
如果您使用dynamic
关键字,例如在使用 a 实现动态代理时,DynamicObject
显然您不会有 intelliSense,但这是由关键字的性质引起的,dynamic
而不是由关键字proxy
本身引起的。您可以查看此链接以了解如何使用 DynamicObject 实现代理