未填充自动属性初始值设定项

本文关键字:填充 属性 | 更新日期: 2023-09-27 17:57:03

我有一个类,其中包含两个属性,一个填充了 c# 6.0 的新自动属性初始值设定项,另一个仅实现了 getter 速记:

public SampleEnum SampleProp1 { get; } = SampleEnum.Value1;
public SampleEnum SampleProp2 { get { return SampleEnum.Value1; } }

此类是 WCF 终结点的参数,当此终结点称为 SampleProp1 时,仅包含默认枚举值。

为什么会这样?

未填充自动属性初始值设定项

C# 6.0 中的自动属性初始值设定项是语法糖,编译器将为初始化为给定表达式的属性创建支持字段。

因此,您的代码等效于以下声明(为了澄清起见,我添加了一个类"SampleClass"):

class SampleClass
{
    // compiler-generated backing field initialized by the field initializer
    private readonly SampleEnum __sampleProp1 = SampleEnum.Value1;
    public SampleEnum SampleProp1 { get { return __sampleProp1; } }
    public SampleEnum SampleProp2 { get { return SampleEnum.Value1; } }
}

您的问题来自这样一个事实,即 WCF 使用的反序列化程序不执行字段初始值设定项

一种可能的解决方案是使用 OnDeserializingOnDerserialized 属性,并将所有初始化代码放入单独的方法中(如此问题中所述:反序列化时 C# 类中的字段初始值设定项未运行)。

SampleEnum 真的是一个枚举吗?我在一个简单的类中尝试了你的代码,有一个实际的枚举,它似乎工作正常。

我可以看到可能存在 SampleEnum 实际上是一个类的问题,并且在初始化具有属性的类时尚未初始化 Value1。

这是我尝试的按预期工作的方法:

class Program
{
    static void Main(string[] args)
    {
        var x = new MyClass();
        Debug.Print("{0}", x.SampleProp1);
        Debug.Print("{0}", x.SampleProp2);
    }
    public class MyClass
    {
        public enum SampleEnum { Value0, Value1 , Value2 };
        public SampleEnum SampleProp1 { get; } = SampleEnum.Value1;
        public SampleEnum SampleProp2 { get { return SampleEnum.Value1; } }
    }
}