C#类中声明匿名类型成员用var报CS0825错误该如何解决
C# 类成员实现类似匿名类型效果的解决方案
根本原因
C# 的匿名类型是编译器生成的内部类型,没有可在代码中显式引用的公开名称,且var关键字仅支持局部变量的类型推导,因此无法直接将匿名类型声明为类的字段或属性。
推荐解决方案
方案1:C# 9+ 使用Record类型(最优)
Record类型是C# 9引入的不可变值类型,语法简洁,序列化JSON的行为和匿名类型完全一致,完美匹配你需要灵活类型、方便导出JSON的需求:
public class Logger { // 定义嵌套的Record类型,支持任意类型的属性(int、string等均可) public record RecordIdDef(int Foo, string Bar); // 静态属性可直接通过类名访问,和你预期的用法完全一致 public static RecordIdDef RecordId { get; } = new(0, "can be also a string"); } // 访问方式 var foo = Logger.RecordId.Foo; var bar = Logger.RecordId.Bar;
方案2:低版本C# 使用POCO类
如果使用的C#版本低于9,没有Record语法,可以自定义普通的只读类实现相同效果:
public class Logger { public class RecordIdDef { // 只读属性保证和匿名类型一样的不可变特性 public int Foo { get; } public string Bar { get; } public RecordIdDef(int foo, string bar) { Foo = foo; Bar = bar; } } public static RecordIdDef RecordId { get; } = new RecordIdDef(0, "can be also a string"); }
方案3:使用dynamic(不推荐)
如果不想额外定义类型,也可以用dynamic声明成员,但是会丢失编译时类型检查,写错属性名不会在编译阶段报错,运行时才会触发异常,仅适合临时快速实现的场景:
public class Logger { public static dynamic RecordId { get; } = new { Foo = 0, Bar = "can be also a string" }; }
以上三种方案都支持任意类型的属性,完全可以替代枚举实现多类型取值、导出JSON的需求。
内容的提问来源于stack exchange,提问作者user2261062
相关产品推荐
相关产品推荐

