1

私はprotobuf-netv2(r480)を使用しており、メソッドMetaTypeを介して一部のメンバーが追加されたクラスがあります。Add()それらを列挙したい(ValueMemberオブジェクトのコレクションを取得したい)が、インデックスごとのインデクサーがあるにもかかわらず、でMetaTypeはないようIEnumerableです。

メンバーを列挙する方法としては、2つあります。MetaType内部実装が変更されると、プライベートフィールドでの反省が壊れます。ブルートフォース攻撃は、遅く、無駄で、ばかげています。

反射:

ValueMember[] fields = ((IEnumerable)typeof(MetaType)
    .GetField("fields", BindingFlags.Instance | BindingFlags.NonPublic)
    .GetValue(metaType)).OfType<ValueMember>().ToArray();

ブルートフォース(簡潔にするためにLINQが使用され、forループの方がおそらく高速です):

ValueMember[] fields = Enumerable.Range(0, int.MaxValue).Select(i => metaType[i])
    .Where(m => m != null).ToArray();

もっと良い方法はありますか?

4

1 に答える 1

1

はい、公開されていません。内部.Fieldsプロパティがありますが、パブリックAPIでそれを公開するための機能リクエストを追加する価値があります。

これは、r581以降から次の方法で入手できます。

ValueMember[] fields = metaType.GetFields();
SubType[] subTypes = metaType.GetSubtypes();
于 2012-08-19T13:14:34.803 に答える