FormatterServices.GetSerializableMembers返回派生类型的protected和internal字段两次。一次作为SerializationFieldInfo
的实例,一次作为RtFieldInfo
。GetSerializableMembers(FormatterServices)两次返回相同的字段!为什么?
我觉得这很混乱!任何人都可以帮助我理解为什么微软决定以这种方式实现它?
我写了重新制作我的问题的一个范例程序:
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
的每一次报道。然而,这是运行程序时的实际输出:正如你所看到protectedField
出现两次,名称不同但具有相同的元数据
DerivedA BaseA+privateField (67108865) DerivedB protectedField (67108866) BaseB+protectedField (67108866)
令牌,因此它确实是非常相同的领域。
任何人都可以解释为什么吗?
显然,这已经知道了一段时间:http://msdn.microsoft.com/en-us/library/2bb1dc1s(v=vs.90).aspx(评论部分)。 – 2013-03-01 23:30:05
但是仍然没有解释...... :-( – 2013-03-02 14:46:54