如何通过另一个设置数组的成员属性

时间:2019-08-01 14:49:47

标签: c# arrays .net

考虑下一个代码:

    public Color TotalColor { get; set; }
    public string TotalColorName
    {
        get => TotalColor.ToString();
        set => TotalColor = Color.FromHex(value);
    }

效果很好。现在,我正在尝试对两个数组实施相同的方法:

    public string[] AreaColorNames { set; } = new string[3];
    public Color[] AreaColors { get; } = new string[3];

我应该如何为AreaColorNames编写二传手?应该是这样的:

AreaColorNames
{
    set
    { 
      AreaColors[index] = Color.FromHex(value);
    }
}

,但是设置器中没有index参数。有一些解决方法吗? 谢谢。

修改

在我的情况下,许多颜色可以不同,所以我不能使用“左中右右”方法。

让我解释一下我要做什么。我正在开发一个内部库,用于读取确定的文件格式。消费者将通过其他应用程序使用它,例如桌面和移动。因此,我不想自己读取颜色值,因为在一个系统类型Color中描述了System.Drawing,在另一个系统中描述了Xamarin.Forms等。我想我可以拥有接口中的ColorName属性,将在每个实现中用作函数参数和适当的设置器。由于库专用于仅在我们自己的应用程序中使用,因此我不会担心错误使用-它会受到内部安排的限制。

1 个答案:

答案 0 :(得分:3)

有很多方法可以解决此问题。使用带有indexers的自定义集合类型,您可能会真的很喜欢。

但是我建议您根据实际需要找到最简单的方法。例如,考虑一下如何使用AreaColorNames:为某人设置特定索引到特定字符串真的有意义吗?听起来您是在邀请别人犯错误。如果它们提供的索引大于2怎么办?如果他们提供的字符串不代表十六进制值怎么办?

如果您知道只有三个“区域”,那么这是否是模型的必要组成部分,您可以为其命名?例如:

public class AreaColors
{
  public Color LeftColor {get;set;}
  public Color MiddleColor {get;set;}
  public Color RightColor {get;set;}
  public IReadOnlyCollection<string> TotalColors => new[]{LeftColor, MiddleColor, RightColor}
}

我认为应该在将十六进制值设置为Color之前,先将其设置在这样的对象上:应该让使用代码的编写者考虑诸如此类的东西如果给定的字符串不是有效的颜色,该怎么办。