gpt4 book ai didi

c# - 是否可以使用与属性类型本身不同的类型来调用属性 setter ?

转载 作者:行者123 更新时间:2023-11-30 20:35:57 25 4
gpt4 key购买 nike

我有一个 Layer 类,它有一个唯一的 Name 属性作为标识符:

public class Layer {
public string Name { get; set; }
...
// Various other properties
...
}

此外,我有一个 DiagramHandler 来处理(除其他事项外)图层管理

public class DiagramHandler {
private Layer _activeLayer;
public Layer ActiveLayer {
get { return _activeLayer; }
set {
Layer layer = DiagramLayers.FirstOrDefault(l => l.Name.Equals(value.Name);
if (layer != null) {
_activeLayer = layer;
} else {
// Error handling
}
}
}

public ICollection<Layer> DiagramLayers { get; set; }
}

如您所见,我已将所有可能的图层存储在处理程序中的一个集合中,并将当前事件的单个图层存储在其自己的属性中。如果设置了后者,则会识别集合中的图层之一并将其设置为事件图层。现在,因为我实际上只需要层名称来正确识别层,我想知道我是否可以只将一个字符串传递给 ActiveLayer 的 setter 而不是整个层。所以我可以这样做:

// Yes, the DiagramHandler is a singleton
DiagramHandler.Instance.ActiveLayer = "Background";

不必这样做:

DiagramHandler.Instance.ActiveLayer = new Layer() { Name = "Background" };

我知道我可以使用 setter 函数(我现在实际上正在做),但我更喜欢使用普通的属性 setter 并且很好奇是否有我不知道的语言功能或者是否有一个更优雅和更好的解决方案。

最佳答案

一种可能性是创建一个 custom conversion operatorstringLayer 之间,假设 Layer 是您可以修改的类型,而不是第三方类型。

public static explicit operator Layer(string layerName)
{
return new Layer { Name = layerName };
}

Layer myLayer = (Layer)"Background";

您还可以使用 implicit 关键字来避免需要显式转换。

但请记住,这是一个全局运营商,而不仅仅是您属性(property)的一部分。

一个更本地化的替代方法是使用像 SetActiveLayer 这样的方法来代替属性,它有两个重载 - 一个接受 Layer 和一个接受字符串并创建层。

关于c# - 是否可以使用与属性类型本身不同的类型来调用属性 setter ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37408124/

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