FormatterServices.GetSerializableMembersは、派生型の保護フィールドと内部フィールドを2回返します。のインスタンスとしてSerializationFieldInfo
1回、。として1回RtFieldInfo
。
これは非常に紛らわしいと思います!マイクロソフトがこの方法で実装することを決定した理由を誰かが理解するのを手伝ってもらえますか?
問題を再現するサンプルプログラムを作成しました。
class Program
{
[Serializable]
public class BaseA
{
private int privateField;
}
[Serializable]
public class DerivedA : BaseA { }
[Serializable]
public class BaseB
{
protected int protectedField;
}
[Serializable]
public class DerivedB : BaseB { }
static void Main(string[] args)
{
Program.PrintMemberInfo(typeof(DerivedA));
Program.PrintMemberInfo(typeof(DerivedB));
Console.ReadKey();
}
static void PrintMemberInfo(Type t)
{
Console.WriteLine(t.Name);
foreach (var mbr in FormatterServices.GetSerializableMembers(t))
{
Console.WriteLine(" {0} ({1})", mbr.Name, mbr.MetadataToken);
}
Console.WriteLine();
}
}
私はそれを期待しprivateField
、protectedField
それぞれ1回報告されます。ただし、これはプログラム実行時の実際の出力です。
DerivedA BaseA + privateField(67108865) DerivedB protectedField(67108866) BaseB + protectedField(67108866)
ご覧のとおりprotectedField
、2回表示されますが、名前は異なりますが、メタデータトークンが同じであるため、実際にはまったく同じフィールドです。
誰かが理由を説明できますか?