每个 .net 开发人员都知道属性的概念。粗略的 99.99%,它只是将两个方法(getter 和 setter)粘合在一起的一段元数据。
同样的事情通常也适用于事件,包括它们的 add、remove 和 invoke 方法。
ECMA-335 描述了一种 «Other» 方法语义,适用于属性或事件。从概念上讲,一个属性或一个事件可以有多个“其他”方法。
今天是我第一次偶然发现一个带有“其他”方法的属性。当然,它必须与 COM 有关。EnvDTE 程序集(用于将插件写入 Visual Studio)中的接口 EnvDTE.Property 包含定义如下的属性:
.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 )
}
显然,VBScript 和 VB.NET 之前的 VB 版本可以使用 Let 关键字定义属性。Let 与 Set 具有相同的签名。我感觉这里有关系。
但是有谁知道这个属性是如何用 EnvDTE 编写的语言声明的?如何创建具有相同模式的程序集(不使用 ilasm,这太容易了)?有没有人遇到过类似的财产?
有没有人见过其他的“其他”属性,可能与这个不同的语义?如果是,他们习惯什么?