[英]Is it possible for the value property to be a different data type in a setter method for attribute
[英]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,并且很好奇是否有我不知道的语言功能,或者是否还有更优雅的功能和很好的解决方案。
一种可能性是在string
和Layer
之间创建一个自定义转换运算符 ,假设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.