3

あるタイプのプロパティについて熟考していて、プロパティにパブリックセッターとゲッターの両方があるかどうかを確認したいと思いました。残念ながら、はアクセシビリティレベルを示していませんPropertyInfo。だから私は興味深い説明があるものに目を向けました(私の強調):CanReadCanWritePropertyInfo.GetAccessors()

要素が現在のインスタンスによって反映されるプロパティのパブリックget、set、およびその他のアクセサーを反映する配列を返します。

どのような「他のアクセサ」がありますか?他のアクセサーの可能性があるだけですか、それともプロパティの単純なset / getデュオ以上のものを実際に持っているCLI言語が存在しますか?

4

2 に答える 2

5

実際には、ゲッターとセッターだけがあります。技術的には、IIRCのCLI仕様(ECMA 335セクション1.8.11.3)はこれらだけに制限されていないため、他の言語は他の意味を自由に追加できますが、実際にはありません。

これは表に示され、ILII.17のキャプションを使用します(ゲッター、セッター、および属性用であることに注意してください)。.other.get.set.custom

編集

特に、仕様に含まれている例に注意してください。

  // the declaration of the property 
  .property int32 Count() { 
    .get instance int32 MyCount::get_Count() 
    .set instance void MyCount::set_Count(int32) 
    .other instance void MyCount::reset_Count() 
  } 

これは、「リセット」がオプションであることを示唆しています。ただし、実際には、これは反射パターンを介して処理されます。だから:

public int Foo {get;set;}

のリセット方法は慣例ですが、コンパイラはこれをカスタムアクセサに処理しません。public void ResetFoo()Foo

using System;
using System.ComponentModel;
public class MyType
{
    public int Foo { get; set; }
    public void ResetFoo() { Foo = 0; }

    static void Main()
    {
        var obj = new MyType {Foo = 123};
        TypeDescriptor.GetProperties(typeof(MyType))["Foo"].ResetValue(obj);
        Console.WriteLine(obj.Foo); // outputs: 0

        var accessors = typeof (MyType).GetProperty("Foo").GetAccessors();
        // writes get_Foo and set_Foo
        foreach(var acc in accessors) Console.WriteLine(acc.Name);
    }
}
于 2012-07-26T11:30:53.637 に答える
1

イベントには、デリゲートを登録するためのアクセサーがaddあります(これがに変換されます)。remove+=

編集:わかりました、それらはプロパティとはほとんど関係がありませんが、「その他のアクセサ」のカテゴリに分類されます。、興味深いことに、とEventInfoのようなメソッドしかありません。さらに、とがありますが、それは私があまり知らないもっと暗い魔法です...GetAddMethodGetRemoveMethodGetOtherMethodGetRaiseMethod

于 2012-07-26T11:30:27.863 に答える