我有一个Layer类,其中有一个唯一的Name属性作为标识符:
public class Layer {
public string Name { get; set; }
...
// Various other properties
...
}
此外,我还有一个处理(除其他外)图层管理
的DiagramHandlerpublic 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,如果有一个我不知道的语言特性或是否有一个更优雅,更好的解决方案。
答案 0 :(得分:3)
一种可能性是在string
和Layer
之间创建custom conversion operator,假设Layer是您可以修改的类型而不是第三方类型。
public static explicit operator Layer(string layerName)
{
return new Layer { Name = layerName };
}
Layer myLayer = (Layer)"Background";
您还可以使用implicit
关键字来避免要求显式转换。
请记住,这是一个全球运营商,而不仅仅是您财产的一部分。
更本地化的替代方法是使用类似SetActiveLayer
的方法而不是属性,它有两个重载 - 一个接受Layer,另一个接受字符串并创建图层。
答案 1 :(得分:1)
不,不可能。您可以在Layer
类上进行隐式转换重载(非常臭 - 我不推荐这个!),或者拥有您目前拥有的setter方法。
不幸的是,你的解决方案是解决问题的最好方法,没有隐藏的语法糖!