Каждый разработчик .net знает о понятии свойств. Грубый 99,99%, это всего лишь кусочек метаданных, склеивающих два метода: геттер и сеттер.
То же самое происходит обычно для событий, с помощью метода add, remove и invoke.
В ECMA-335 описан семантический метод "Другой", который применим либо к свойству, либо к событию. Понятно, что свойство или событие могут иметь несколько "других" методов.
Сегодня в первый день я наткнулся на имущество с помощью "другого" метода. И, конечно же, это должно было быть связано с COM. Интерфейс EnvDTE.Property в сборке EnvDTE (используемый для записи добавлений в 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 )
}
По-видимому, VBScript и версии VB до VB.NET могут определять свойства с использованием ключевого слова Let. И Let имеет ту же подпись, что и Set. Я чувствую, что здесь есть отношения.
Но кто-нибудь знает, как это свойство было объявлено на языке, на котором написана EnvDTE? Как я могу создать сборку с тем же шаблоном (без использования ilasm, это было бы слишком легко)? И кто-нибудь сталкивался с подобным свойством?
И кто-нибудь видел другие "другие" свойства, возможно, другую семантику, чем эта? И если да, к чему они привыкли?