是否可以使用不同类型的属性设置器作为属性的类型本身?

时间:2016-05-24 08:25:21

标签: c# setter

我有一个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,如果有一个我不知道的语言特性或是否有一个更优雅,更好的解决方案。

2 个答案:

答案 0 :(得分:3)

一种可能性是在stringLayer之间创建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方法。

不幸的是,你的解决方案是解决问题的最好方法,没有隐藏的语法糖!