首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后期绑定静态调用- C# 4.0

后期绑定静态调用- C# 4.0
EN

Stack Overflow用户
提问于 2011-09-03 01:44:56
回答 4查看 1.2K关注 0票数 0

我的目标是能够使用智能感知,同时仍然指示编译器生成后期绑定代码(即CallSites和绑定器)。

假设我有

代码语言:javascript
复制
class MyDynamicDataProvider
{
   public int Data{get;set}
}

我想写下:

代码语言:javascript
复制
MyDynamicDataProvider provider = new MyDynamicDataProvider();
int x = provider.Data;

我希望数据属性调用是后期绑定的。然而,目前,如果我没有将provider变量声明为动态,编译器将预先绑定调用。即在运行时,将返回存储在属性的支持字段中的值。

同时,我希望在编码时使用智能感知,这意味着我应该使用适当的类型来声明提供者。

有没有办法同时获得两端(使用intellisense的静态声明,同时在运行时依赖动态绑定)?

编辑1:有人可能想知道为什么不直接使用getter来执行我需要的任何逻辑。问题是,我正在尝试开发一些元类,这将允许开发人员只定义类和属性,使用getter,setter,方法等,而魔术正在通过动态的方式发生。有很多这样的类型,我希望在类本身中避免这种冗余的代码。

编辑2:如果我能用一个属性声明一个类,告诉编译器延迟绑定对它成员的所有调用,那就太好了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-03 03:01:52

看起来你实际上并不想要dynamic,你只是想为静态定义的属性和方法动态实现功能。如果是这种情况,您可以将类创建为抽象类,然后动态实现它们。

有几种方法可以做到这一点。直接使用Reflection.Emit或CodeDOM生成继承自抽象类的类。或者,您可以使用Castle DynamicProxy这样的工具来简化这一过程(而且通常会稍微慢一些)。

票数 0
EN

Stack Overflow用户

发布于 2011-09-03 01:54:09

Visual Studio不能在后期绑定的对象上提供智能感知,因为它不知道该成员是否实际“存在”。Visual Studio可能会开箱即用地提供这一功能--但它没有。默认的intellisense只是在动态上关闭。有两种解决方案:

  1. 如果您知道要调用的成员,为什么还要尝试使用后期绑定?
  2. 某些产品(如Resharper )通过静态查找在其他地方进行的后期绑定调用来提供伪智能感知。在下图中,它为Hello提供了智能感知,因为在其他地方有进行该调用的代码。这很聪明,但也不是万无一失的。

票数 2
EN

Stack Overflow用户

发布于 2011-09-03 01:47:37

要做到这一点,您最好的选择是实现Data,这样它就可以动态地执行您想要的操作,可能会使用外观。

如果我们假设你有一个MyDynamicDataProvider,当它被作为动态调用时,它知道该做什么-那么你可以使用一个静态类型的外观,如下所示:

代码语言:javascript
复制
 class DataProviderFacade 
 { 
     private dynamic inner;
     public DataProviderFacade(dynamic inner)
     {
         this.inner = inner;
     }

     public int Data { get { return inner.Data; } }
 }

这就是说,我不能想象你为什么需要这个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7287303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档