是否可以使用与 属性 类型本身不同的类型来调用 属性 setter?
Is it possible to call a property setter with a different type as the property's type itself?
我有一个图层 class,它有一个唯一的名称 属性 作为标识符:
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 并且很好奇是否有我不知道的语言功能,或者是否有更优雅和更好的解决方案。
不,不可能。您可以在 Layer
class 上进行隐式转换重载(非常难闻 - 我不推荐这样做!),或者像您当前那样使用 setter 方法。
不幸的是,您的解决方案是解决问题的最佳方式,没有隐藏的语法糖!
一种可能性是在 string
和 Layer
之间创建一个 custom conversion operator,假设 Layer 是您可以修改的类型,而不是第三方类型。
public static explicit operator Layer(string layerName)
{
return new Layer { Name = layerName };
}
Layer myLayer = (Layer)"Background";
您还可以使用 implicit
关键字来避免需要显式强制转换。
不过请记住,这是一个全局运算符,而不仅仅是 属性 的一部分。
一种更本地化的替代方法是使用类似 SetActiveLayer
的方法来代替属性,它有两个重载 - 一个接受图层,一个接受字符串并创建图层。
我有一个图层 class,它有一个唯一的名称 属性 作为标识符:
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 并且很好奇是否有我不知道的语言功能,或者是否有更优雅和更好的解决方案。
不,不可能。您可以在 Layer
class 上进行隐式转换重载(非常难闻 - 我不推荐这样做!),或者像您当前那样使用 setter 方法。
不幸的是,您的解决方案是解决问题的最佳方式,没有隐藏的语法糖!
一种可能性是在 string
和 Layer
之间创建一个 custom conversion operator,假设 Layer 是您可以修改的类型,而不是第三方类型。
public static explicit operator Layer(string layerName)
{
return new Layer { Name = layerName };
}
Layer myLayer = (Layer)"Background";
您还可以使用 implicit
关键字来避免需要显式强制转换。
不过请记住,这是一个全局运算符,而不仅仅是 属性 的一部分。
一种更本地化的替代方法是使用类似 SetActiveLayer
的方法来代替属性,它有两个重载 - 一个接受图层,一个接受字符串并创建图层。