gpt4 book ai didi

c# - 如何使用扩展方法公开记录属性并将该属性设为私有(private)

转载 作者:行者123 更新时间:2023-12-03 08:01:20 26 4
gpt4 key购买 nike

我试图使其无法根据名称访问记录属性,而是通过扩展方法访问记录属性。

例如,我希望能够做到这一点Axe.GetById(1378).GetName()
但做不到Axe.GetById(1378).Name

我尝试在记录内声明一个私有(private)字段,但后来我根本无法在扩展方法中访问它以返回它。

public sealed record AxeEnum(string Name, int LevelReq, int ItemId)
{
private int privateField;
}
static class Axe
{
static Dictionary<int, AxeEnum> AXES = new Dictionary<int, AxeEnum>();
static AxeEnum STEEL = new AxeEnum("Steel", 41, 1378);


static Axe()
{
AXES.Add(GetId(STEEL), STEEL);
}

public static AxeEnum GetById(int id)
{
AXES.TryGetValue(id, out var axe);
return axe;
}

public static int GetLvlReq(this AxeEnum axe) => axe.LevelReq;
public static int GetId(this AxeEnum axe) => axe.ItemId;
public static string GetName(this AxeEnum axe) => axe.Name;
}

最佳答案

where I can't access the record properties based on their name

如果您不希望记录呈现的形状:不要使用记录;只需使用您想要的任何成员和可访问性规则创建您自己的即可。


I tried declaring a private field inside the record, but then I can't access it in my extension method at all in order to return it.

扩展方法仍然必须遵守可访问性规则;目前该字段是private,除非通过该类型或嵌套类型中的代码,否则无法访问该字段,并且扩展方法必须位于顶级(非嵌套)类型上。我们不能使用 protected,因为扩展方法必须是 static 类型(不能继承任何内容),加上 record这是密封的。所以:剩下内部:

public sealed record AxeEnum(string Name, int LevelReq, int ItemId)
{
internal int privateField;
}

但就个人而言:我可能只是将其设为记录本身的公共(public)实例属性或方法。

关于c# - 如何使用扩展方法公开记录属性并将该属性设为私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74053077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com