[英]Get default value of a field
我想知道如何获取任意类的字段的默认值。
例如,
public class Example
{
public int a = 10;
}
当仅给出typeof(Example)
时,我想获取值10
。
这个默认值很有用,因为我正在编写一个函数来为任何类型创建一个非空的默认实例。 最好将实例初始化为声明中给定的值。
请注意,通过默认构造函数创建实例并获取值不是我的选择,因为我希望正在使用的函数可以应用于带有或不带有默认构造函数的类。
另外, DefaultValueAttribute
也不是我的选择。 据我所知,属性只能采用几种类型作为其参数。 因此,我无法获得自定义类型的字段的默认值。
编辑1:
我知道这个问题似乎是Class成员的Get default value的重复,但事实并非如此。 在引用的问题中,OP对使用构造函数获取类的真实实例感到满意。 但就我而言,我不确定要处理的类是否存在默认构造函数。
我正在编写一个默认值生成器,因为我需要一个任意类型的伪造对象。 也就是说,没有假设类型会是什么样。 伪对象将通过GUI进行检查,并且用户可以编辑在检查器中公开的字段的值。 在这里, 任意类型对我很重要,因为检查员不仅应处理我定义的类型,还应处理库中定义的类型。 而且,伪造的对象永远不能为空,否则检查员会崩溃,大声笑。
FormatterServices.GetSafeUninitializedObject
我分配了一个可接受的伪对象,因为它分配了内存块并将其初始化为零。 但是我觉得最好进一步初始化假对象,以便字段可以在检查器中显示其默认值。
感谢Patrick Hofman提醒我,我所说的“默认值”不是真正的默认值,而是将在构造函数中求值的表达式。 话虽如此,我仍然想知道是否有可能获取字段初始化表达式并对其进行事件评估。
我认为应该有一种方法,因为像ILSpy这样的反编译器可以在反编译结果中显示字段初始化程序。
您只能获取常量的值,而不能获取任何其他类型的变量,因为它们需要一个初始化的类来从中检索值,而不再是真正的默认值,而只是当前值。
先前重复的“ 获取类成员的默认值”会告诉您,如果删除“ 不创建实例约束”,该怎么办 。
这个如何?
public class Example
{
public readonly DateTime a = DateTime.Now;
}
您能告诉我此字段的默认值是什么吗? 即使可以,它实际上并不是默认值,而是某个时间点某个变量的评估值。
您可以检查IL代码,并查找名为.ctor
成员(这些是实例构造函数)。
然后找到一个不会 call
另一个Example::.ctor
重载,而是调用基类构造函数的实例,在您的情况下为[mscorlib]System.Object::.ctor()
。 (如果不存在,则实例字段初始化器将无法访问(病理情况)!)
然后,在此成员的IL中,调用基类.ctor
之前的字段分配stfld
是字段初始化程序。 瞧!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.