我有一个类处理一些用户界面的东西,让我们调用这个类和实例用户界面为例.

在这个类中,我将有一个 colored颜色 类型的对象:

public class Colors {
    public ConsoleColor Primary { get; set; } = ConsoleColor.White;
    public ConsoleColor Default { get; set;  } = ConsoleColor.Gray;
    public ConsoleColor Input { get; set; } = ConsoleColor.Gray;
    public ConsoleColor Success { get; set; } = ConsoleColor.Green;
    public ConsoleColor Error { get; set; } = ConsoleColor.Red;
    public ConsoleColor Highlight { get; set; } = ConsoleColor.Blue;
}

在UI中,我有:

public static class UI {
    public static readonly Colors Colors = new();

    public static void ConfigureColors(Action<Colors> modification) {
        modification.Invoke(Colors);
    }
}

问题是,我希望能够像这样访问UI外部的Colors属性的getter:

var primaryColor = UI.Colors.Primary;

但不是二传手...

UI.ConfigureColors(colors => {
    colors.Primary = ConsoleColor.Yellow;
});

UI.Colors.Primary = ConsoleColor.Green;

但是我只希望能够使用ConfigureColors()方法设置 colored颜色 .

我试着在Colors类中处理属性的可访问性,比如使它们成为只读或"私有集",但我想到的所有修改都导致这两个选项都不起作用.

推荐答案

您可以通过声明getter-only属性的接口公开 colored颜色 .然后,实现也可以具有setter:

public interface IColors
{
    ConsoleColor Primary { get; }
    ConsoleColor Default { get; }
    ConsoleColor Input { get; }
    ConsoleColor Success { get; }
    ConsoleColor Error { get; }
    ConsoleColor Highlight { get; }
}

public class Colors : IColors
{
    public ConsoleColor Primary { get; set; } = ConsoleColor.White;
    public ConsoleColor Default { get; set; } = ConsoleColor.Gray;
    public ConsoleColor Input { get; set; } = ConsoleColor.Gray;
    public ConsoleColor Success { get; set; } = ConsoleColor.Green;
    public ConsoleColor Error { get; set; } = ConsoleColor.Red;
    public ConsoleColor Highlight { get; set; } = ConsoleColor.Blue;
}

如下配置:

public static class UI
{
    public static readonly IColors Colors = new Colors();

    public static void ConfigureColors(Action<Colors> modification)
    {
        modification.Invoke((Colors)Colors);
    }
}

用法示例:

var primary = UI.Colors.Primary;       // Okay

UI.Colors.Primary = ConsoleColor.Gray; // Error CS0200  Property or indexer 
                                       // 'ConfigurableColors.IColors.Primary'
                                       // cannot be assigned to --it is read only

Csharp相关问答推荐

如何在Shell中创建WinUI 3图形界面?

System.Text.Json Utf8JsonReader正在读取数组值两次

C# uwp中的Win11启动屏幕剪辑工作方式不同

"virtual"修饰符对接口成员有什么影响?

ITypeLib2.GetLibStatistics()在C#中总是抛出AccessViolationException

Rider将.NET安装在哪里

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

C#阻塞调用或await calling inside calling方法

TCPClient阅读流

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

try 使用C#ASP.NET收集WMI信息时访问被拒绝,但在PowerShell中工作

调用Task.Run()与DoSomethingAsync()有什么不同?

Savagger使用Fastendpoint更改用户界面参数

TagHelpers在新区域不起作用

按需无缝转码单个HLS数据段

如何在Akka.NET中重新启动执行元时清除邮箱

.NET Google Workspace API获取错误CS0266

KeyDown从我的文本框中删除输入,如何停止?

毛伊岛.NET 8图片不再适合按钮

忽略Visual Studio代码中的StyleCop规则