FormatterServices.GetSerializableMembers은 파생 된 유형에 대해 보호 된 필드와 내부 필드를 두 번 반환합니다. 한 번은 SerializationFieldInfo
의 인스턴스로, 한 번은 RtFieldInfo
으로 표시됩니다.GetSerializableMembers (FormatterServices)는 동일한 필드를 두 번 반환합니다! 왜?
매우 혼란 스럽습니다. Microsoft가 왜이 방법을 구현하기로 결정했는지 이해하는 사람은 누구든지 나를 도울 수 있습니까?
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
한 번 각을보고 있다는 기대 :
나는 내 문제를 생산할 다시 샘플 프로그램을 작성했습니다.
DerivedA BaseA+privateField (67108865) DerivedB protectedField (67108866) BaseB+protectedField (67108866)
당신이 protectedField
다른 이름으로하지만 같은 메타 데이터를 두 번 나타날 볼 수 있듯이 토큰 그래서 그것은 참으로 바로 그 분야이다 : 그러나이 프로그램을 실행 실제 출력이다.
이유를 설명 할 수 있습니까?
분명히 이것은 한동안 알려져 있습니다. http://msdn.microsoft.com/en-us/library/2bb1dc1s(v=vs.90).aspx (의견 섹션). –
하지만 여전히 설명이 없습니다 ... :-( –