定义记录类时,如何将属性定位到参数、字段或属性?
例如,我想使用,JsonIgnore
但这不能编译,因为它对字段或属性有属性使用限制:
record Person(string FirstName, string LastName, [JsonIgnore] int Age);
Run Code Online (Sandbox Code Playgroud) 关于新记录功能的两个问题:
如何使用反射识别记录?看 [here][1] 也许有一种方法可以检测到,EqualityContract
但我不确定这是否可行?
是否可以有一个泛型约束,即泛型类型是记录?也就是说,是否可以使用约束指示类型参数 T 必须是记录类?
在 C# 9 中,我们可以创建位置记录,使它们获得一个构造函数,规范草案将其称为主构造函数。我们也可以创建自定义构造函数,但如规范中所述:
如果记录具有主构造函数,则任何用户定义的构造函数(“复制构造函数”除外)都必须具有显式的 this 构造函数初始值设定项。
所以这是不允许的:
public record A(string Foo, int Bar)
{
public A(MyClass x)
{
Foo = x.Name;
Bar = x.Number;
}
}
Run Code Online (Sandbox Code Playgroud)
并且确实导致 CS8862“在带有参数列表的记录中声明的构造函数必须具有 'this' 构造函数初始值设定项。” 我们必须写:
public record A(string Foo, int Bar)
{
public A(MyClass x) : this(x.Name, x.Number) {}
}
Run Code Online (Sandbox Code Playgroud)
反而。在这种情况下,这几乎不是问题,但可以想象一个更长的初始化逻辑,它不适合this
构造函数初始化程序。
问题是:为什么存在这种限制?我猜想解除它会以某种方式打破记录的某些功能,但这是一个足够新的功能,我无法想出办法来做到这一点。自动生成的主构造函数是否做了一些对记录正常工作至关重要的事情,因此必须调用它?
record
在 C# 中使用类型,看起来构建类似可区分联合的数据结构可能非常有用,我只是想知道我是否遗漏了一些我以后会后悔的问题。例如:
abstract record CardType{
// Case types
public record MaleCardType(int age) : CardType{}
public record FemaleCardType : CardType{}
// Api
public static MaleCardType Male(int age) => new MaleCardType(age);
public static FemaleCardType Female => new FemaleCardType();
}
var w = CardType.Male(42);
var x = CardType.Male(42);
var y = CardType.Male(43);
var z = CardType.Female;
Assert.Equal<CardType>(w,x); //true
Assert.Equal<CardType>(x,y); //false
Assert.Equal<CardType>(y,z); //false
Run Code Online (Sandbox Code Playgroud)
这似乎比用单例和相等比较器等构建抽象类简单得多,但我是否缺少一些我不想这样做的原因?