C# 如何限制哪些类可以更改另一个非相关类中字段的值

C# 如何限制哪些类可以更改另一个非相关类中字段的值,c#,C#,作为电子游戏的一部分,我需要存储玩家档案 如果我有一个像这样的Player类: public class Player { public string username { get; private set; } public int numberOfWins { get; private set; } public void AddWin() { numberOfWins++; } } public class Game {

作为电子游戏的一部分,我需要存储玩家档案

如果我有一个像这样的
Player
类:

public class Player
{
    public string username { get; private set; }
    public int numberOfWins { get; private set; }

    public void AddWin()
    {
        numberOfWins++;
    }
}
public class Game
{
    Player playerOne;
    Player playerTwo;

    int playerOneScore;
    int playerTwoScore;

    public void HandleGameEnd()
    {
        if (playerOneScore > playerTwoScore)
        {
            playerOne.AddWin();
        }

        else
        {
            playerTwo.AddWin();
        }
    }
}
还有像这样的
游戏
课程:

public class Player
{
    public string username { get; private set; }
    public int numberOfWins { get; private set; }

    public void AddWin()
    {
        numberOfWins++;
    }
}
public class Game
{
    Player playerOne;
    Player playerTwo;

    int playerOneScore;
    int playerTwoScore;

    public void HandleGameEnd()
    {
        if (playerOneScore > playerTwoScore)
        {
            playerOne.AddWin();
        }

        else
        {
            playerTwo.AddWin();
        }
    }
}

我将如何更改我的代码以确保使用
AddWin()
的唯一东西是
HandleGameEnd()

我非常确定您建议的方法从设计角度来看不是最好的,但您可以通过以下方法实现:

StackFrame frame = new StackFrame(1);
var method = frame.GetMethod();
var type = method.DeclaringType; //caller's type
var name = method.Name; //method name

你应该创建一个接口,例如

interface ICanAddWin
{
    void AddWin();
}
然后在您的播放器中明确实施:

class Player : ICanAddWin
{
    void ICanAddWin.AddWin() { ... }
}
游戏
应该使用
ICanAddWin
对象,而不是
玩家
(如果需要,可以添加更多方法)。其他类不知道
AddWin
方法,除非它们将
Player
强制转换为内部接口
ICanAddWin
,这要求它们位于同一程序集中,并使用该接口命名空间添加
(实际上是为了更好地设计每个“客户机”)应该只看到它需要的一些特定接口,而不是
Player
class;铸造是一种糟糕的做法)

最好将
AddWin
方法移动到实现
icandaddwin
的单独类(可以是嵌套在
Player
中的私有类,以访问其私有字段)。这样,当您将
播放器
传递到某个地方时,您完全可以确定它不能被铸造到
ICanAddWin


为了更好地理解,我建议您学习更多OOP和SOLID(特别是接口分离和依赖项反转部分)。

实际上没有办法做到这一点。但是,老实说,你不应该这么做。你可以控制代码,你可以控制在你的对象上调用或不调用公共方法。你能不能让它成为一个游戏的私有方法,并重新安排你的类结构?@David这是真的,但我只是好奇是否有办法做到这一点。