每个.net开发人员都知道属性的概念。粗略的99.99%,它只是一个元数据粘合在一起的两个方法,一个吸气剂和一个设定器。
同样的事情通常用于事件,添加,删除和调用方法。
ECMA-335描述了一种“其他”方法语义,适用于属性或事件。从概念上讲,财产或事件可能有多种“其他”方法。
今天是我第一天偶然发现了一个带有“其他”方法的房产。当然,它必须与COM有关。 EnvDTE程序集中的EnvDTE.Property接口(用于向Visual Studio编写插件)包含一个定义如下的属性:
.property object Value()
{
.custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 )
.get instance object EnvDTE.Property::get_Value()
.other instance void EnvDTE.Property::let_Value(object)
.set instance void EnvDTE.Property::set_Value(object)
}
将let_Value定义为:
.method public hidebysig newslot specialname abstract virtual
instance void let_Value([in] object marshal( struct) lppvReturn) runtime managed internalcall
{
.custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 )
}
显然,VB.NET之前的VBScript和VB版本可以使用Let关键字定义属性。并且Let与Set具有相同的签名。我觉得这里有关系。
但有人知道这个属性是如何用EnvDTE编写的语言声明的吗?我怎么能用相同的模式创建一个程序集(不使用ilasm,这太容易了)?有没有人遇到类似的财产?
有没有人见过其他“其他”属性,可能与这个属性有不同的语义?如果是的话,他们习惯了什么?
答案 0 :(得分:21)
这是一个在VB中出现的COM事物。 Set指定替换属性的引用项的引用,而Let期望将操作数的内容复制到现有属性中。 (另见Property Get)。
IIRC这不是一个核心的COM事物,更多的东西用于语言没有足够的表达能力来处理价值与参考问题到足够精确的程度 - 我相信它可能只适用于你使用IDispatch(你通过属性id而不是方法来寻址而不是自定义接口(你总是必须解析一个方法并调用它)。我很确定VB.NET(或其他.NET语言)不能表达这些东西,因此它们是一种罕见的东西。Box by Essential COM并没有提到它(只有get和set的propget和propput)。 COM IDL& Al Major博士的界面设计在P106上提及它说:
dispinterface DMyInterface { methods: ... [id(3), propputref] void lMyProp([in] IDispatch *pDisp); }
propputref
属性是一个奇怪的小东西,它起源于Visual Basic语法的特性。请考虑以下事项:Dim val as DMyOtherInterface Dim var as DMyInterface Set var.lMyProp = val var.lMyProp = val
这两项任务都是允许的,但意思完全不同。在第一个分页中使用
Set
关键字表示lMyProp被分配了一个接口[...]。第二个赋值是simpe,其中val
对象的值,它是DMyOtherInterface
接口的默认成员的值(默认成员是成员)由DISPID_VALUE
ID标记,如下所述,正被分配到lMyProp
接口的DMyInterface
属性。第一个赋值使用与lMyProp属性关联的propputref方法执行,而第二个赋值使用propput方法。为了使其工作,必须定义propputref 和 propput方法。 如果你对这种做事方式感到困惑,那么你并不孤单。虽然VB有很多很好的功能,从根本上改变了编程的本质,但语言的定义主要是市场驱动而不是设计,有时它显示。
有趣的是,自从2000年初在COM和.COM破坏之前阅读它以来,我从未使用过这本专业书(尽管它的目的是一本好书)。感谢记忆之旅 - 我喜欢人们告诉我们编程越来越难的方式!
没有Lidin书和我一起看看它是否提到.other
但我确定你这么做了(BTW非常感谢Mono.Cecil)
答案 1 :(得分:2)
Visual Studio自动化基于COM。有问题的属性可能是通过支持COM Interop(tlbimp潜力)的工具生成的。我怀疑是否有人用实际的.Net语言对此进行编码。