是否可以使用与 属性 类型本身不同的类型来调用 属性 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 方法。

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

一种可能性是在 stringLayer 之间创建一个 custom conversion operator,假设 Layer 是您可以修改的类型,而不是第三方类型。

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

Layer myLayer = (Layer)"Background";

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

不过请记住,这是一个全局运算符,而不仅仅是 属性 的一部分。

一种更本地化的替代方法是使用类似 SetActiveLayer 的方法来代替属性,它有两个重载 - 一个接受图层,一个接受字符串并创建图层。