繁体   English   中英

是否可以使用与属性类型本身不同的类型来调用属性设置器?

[英]Is it possible to call a property setter with a different type as the property's type itself?

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

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,并且很好奇是否有我不知道的语言功能,或者是否还有更优雅的功能和很好的解决方案。

一种可能性是在stringLayer之间创建一个自定义转换运算符 ,假设Layer是您可以修改的类型,而不是第三方类型。

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

Layer myLayer = (Layer)"Background";

您还可以使用implicit关键字来避免进行显式强制转换。

但是请记住,这是一家全球运营商,不仅是您财产的一部分。

更加本地化的替代方法是使用属性而不是属性,而使用SetActiveLayer类的方法,该方法具有两个重载-一个重载接受Layer,一个重载接受字符串并创建该层。

不,不可能。 您可以在您的Layer类上隐式转换重载(非常臭-我不建议这样做!),或使用当前的setter方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM