我的目标是能够使用智能感知,同时仍然指示编译器生成后期绑定代码(即CallSites和绑定器)。
假设我有
class MyDynamicDataProvider
{
public int Data{get;set}
}我想写下:
MyDynamicDataProvider provider = new MyDynamicDataProvider();
int x = provider.Data;我希望数据属性调用是后期绑定的。然而,目前,如果我没有将provider变量声明为动态,编译器将预先绑定调用。即在运行时,将返回存储在属性的支持字段中的值。
同时,我希望在编码时使用智能感知,这意味着我应该使用适当的类型来声明提供者。
有没有办法同时获得两端(使用intellisense的静态声明,同时在运行时依赖动态绑定)?
编辑1:有人可能想知道为什么不直接使用getter来执行我需要的任何逻辑。问题是,我正在尝试开发一些元类,这将允许开发人员只定义类和属性,使用getter,setter,方法等,而魔术正在通过动态的方式发生。有很多这样的类型,我希望在类本身中避免这种冗余的代码。
编辑2:如果我能用一个属性声明一个类,告诉编译器延迟绑定对它成员的所有调用,那就太好了。
发布于 2011-09-03 03:01:52
看起来你实际上并不想要dynamic,你只是想为静态定义的属性和方法动态实现功能。如果是这种情况,您可以将类创建为抽象类,然后动态实现它们。
有几种方法可以做到这一点。直接使用Reflection.Emit或CodeDOM生成继承自抽象类的类。或者,您可以使用Castle DynamicProxy这样的工具来简化这一过程(而且通常会稍微慢一些)。
发布于 2011-09-03 01:54:09
Visual Studio不能在后期绑定的对象上提供智能感知,因为它不知道该成员是否实际“存在”。Visual Studio可能会开箱即用地提供这一功能--但它没有。默认的intellisense只是在动态上关闭。有两种解决方案:
Hello提供了智能感知,因为在其他地方有进行该调用的代码。这很聪明,但也不是万无一失的。

发布于 2011-09-03 01:47:37
要做到这一点,您最好的选择是实现Data,这样它就可以动态地执行您想要的操作,可能会使用外观。
如果我们假设你有一个MyDynamicDataProvider,当它被作为动态调用时,它知道该做什么-那么你可以使用一个静态类型的外观,如下所示:
class DataProviderFacade
{
private dynamic inner;
public DataProviderFacade(dynamic inner)
{
this.inner = inner;
}
public int Data { get { return inner.Data; } }
}这就是说,我不能想象你为什么需要这个。
https://stackoverflow.com/questions/7287303
复制相似问题