3

我正在研究使用 DynamicProxy 类,我对这个概念还很陌生。在我走得太远之前,我想知道这些类与 IntelliSense 和类型安全的配合如何?

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

4

3 回答 3

1

我正在寻找有关如何使用 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/ ) 的一个非常好的资源。它介绍了这些功能的各种功能和用例。

于 2013-05-17T13:22:32.720 回答
0

它是并且类型安全的,因此智能感知应该可以正常工作。看这个例子:DynamicProxy 教程

您可以看到他们使用泛型来实例化代理类。这意味着它是完全键入的,因此您无需担心。

于 2013-05-15T06:35:07.410 回答
0

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

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

[编辑] 如果您使用dynamic关键字,例如在使用 a 实现动态代理时,DynamicObject显然您不会有 intelliSense,但这是由关键字的性质引起的,dynamic而不是由关键字proxy本身引起的。您可以查看此链接以了解如何使用 DynamicObject 实现代理

于 2013-05-17T12:33:10.483 回答