c# - 您可以使用反射更改 DateTime 对象中 _dateData 的私有(private)字段值吗?

标签 c# .net-core

为了练习,我一直在尝试对几种不同的类型使用反射。目前我正在与 DateTime 对象作斗争。 我试图在不创建新对象的情况下更改现有 DateTime 对象中的数据(显然不是我应该如何使用它们,但这只是为了练习)

根据 DateTime 类的源代码 (https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/DateTime.cs),有一个名为“_dateData”的私有(private) ulong 字段,其中包含对象的实际日期数据。 我尝试以正常方式使用反射来更改它,但这似乎没有任何影响。

DateTime dateTime = DateTime.Now;

FieldInfo dateData = typeof(DateTime).GetField("_dateData",
    BindingFlags.Instance | BindingFlags.NonPublic);

Console.WriteLine(dateTime.ToString()); // Log date before change
Console.WriteLine(dateData.GetValue(dateTime)); // Log dateData before change

dateData.SetValue(dateTime, (ulong)0); // Change dateData

Console.WriteLine(dateTime.ToString()); // Log date after change - No difference
Console.WriteLine(dateData.GetValue(dateTime)); // Log dateData after change - No difference

该代码没有给出任何编译时或运行时错误。我希望该代码段实际上会更改新创建的 DateTime 对象的值,但它似乎没有任何改变...... 我的猜测是,这是因为 _dateData 是一个只读变量。如果是这种情况,还有另一种方法可以改变我所缺少的值(value)观吗?

最佳答案

这当然是可能的,但是由于 DateTime 是一个值类型,所以无法以您期望的方式实现。

改为使用以下内容:

// dateData.SetValue(dateTime, (ulong)0); // Change dateData
TypedReference typed = __makeref(dateTime);
dateData.SetValueDirect(typed, (ulong)0); // Change dateData

这会创建一个指向内存中值类型的托管引用指针,允许您通过反射修改它。

输出:

12/09/2019 15:17:12
9860411019182991289
01/01/0001 00:00:00
0

关于c# - 您可以使用反射更改 DateTime 对象中 _dateData 的私有(private)字段值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57908397/

相关文章:

c# - .NET 中 UnhandledException 和 DispatcherUnhandledException 的区别

c# - Dotnet 核心中的 AOP : Dynamic Proxy with Real Proxy in Dotnet core

c# - 在不使用 RouteAttribute 的情况下使用 ApiControllerAttribute

c# - EF Core 多对多自连接

c# - RFID - 领先的零问题

c# - 如何在 Xamarin Forms 中将行为转换为泛型类型?

c# - 如何定位企业中所有的网络打印机?

c# - 网络核心 : Type or namespace name 'RoleProvider' could not be found

c# - 每个目标 .NET 平台的编译是否不同?

c# - Entity Framework 保存了太多的子实体