DynamicProxy类是否适用于智能感知/类型安全?

时间:2013-05-10 19:09:56

标签: c# intellisense type-safety castle-dynamicproxy dynamic-proxy

我正在考虑使用DynamicProxy类,我对这个概念还不熟悉。在我走这条路太远之前,我想知道这些类在智能感知和类型安全方面的效果如何?

我只是害怕使用类似Castle DynamicProxy(或其他一些)的东西,并且在设置完所有内容之后发现使用我的对象不提供智能感知或类型安全。任何人都可以对此有所了解吗?

3 个答案:

答案 0 :(得分:1)

  

我正在寻找关于DynamicProxy类的直接答案   使用过,以及它们是否支持intellisense,如果是的话......怎么样?

好吧,在解释 DynamicProxy类的工作方式时,您将清楚地了解它们为什么是类型安全的,以及它们如何能够很好地处理intellisense。


首先,让我们了解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类,ProxyGenerator只会创建CustomerProxy类的实例,但会将其作为Customer类型返回。它与执行Customer customer = new CustomerProxy();基本相同。 “动态”部分与.NET dynamic关键字没有任何关系,而是应该读取“Runtime”,因为它只是意味着代理类是在运行时生成的(当应用程序运行时) ),而不是在编译时。哦,如果你想知道它是如何做到的,它会使用System.Reflection.Emit


这是DynamicProxy的简单版本。在创建这些代理类时,不同的框架提供了不同的功能。例如,在Castle Windsor的DynamicProxy中,可以创建Mixins并将其他接口应用于这些代理类 - 也就是说,生成的代理类可能看起来像这样:public class CustomerProxy : Customer, ISomeInterface { ... },即使Customer类也是如此本身没有实现ISomeInterface。这是Castle的DynamicProxy(http://kozmic.net/dynamic-proxy-tutorial/)非常好的资源。它介绍了这些功能的各种功能和用例。

答案 1 :(得分:0)

它是和类型安全的所以intellisense应该工作得很好。 请参阅此示例:DynamicProxy tutorial

你可以看到他们使用泛型来实现代理类的实例化。这意味着它完全打字,所以你没有什么可担心的。

答案 2 :(得分:0)

代理可以被视为调用拦截器(取决于代理实现的类型),因此在编写代码时就像使用已定义的接口或类一样,以便将获得智能感知

然后,根据您实现对类/接口成员的“一些”调用的代理类型将截获

<强> [编辑] 如果您使用dynamic关键字,例如在使用DynamicObject实现动态代理时明显您将没有智能,但这是由{{1}的性质引起的}}关键字,而不是dynamic本身。您可以查看此链接以查看how to implement a Proxy using a DynamicObject