C#中的隐式转换,无需创建新对象

时间:2017-06-29 08:46:10

标签: c# casting implicit-conversion

我试图为一个对象实现一些隐式转换。目前我正在这样做:

public class PathSelector 
{
    private string _path = null;
    public string Path
    {
        get { return _path; }
        set
        {
            if (value != _path)
            {
                _path = value;
                OnPropertyChanged("Path");
            }
        }
    }

    static public implicit operator string(PathSelector pathSelector)
    {
        return pathSelector.Path;
    }

    static public implicit operator PathSelector(string path)
    {
        return new PathSelector() { Path = path };
    }
}

正如您在StringPathSelector的演员表中所看到的,我生成了一个新的PathSelector对象。

我这样用:

public PathSelector PluginPathSelector { get; set; } = new PathSelector();
public string PluginPath
{
    get
    {
        return PluginPathSelector;
    }

    set
    {
        PluginPathSelector = value;
    }
}

我不喜欢这个解决方案,当我将字符串分配给PathSelector对象时,我总是创建一个新对象。这也意味着,在PathSelector属性中需要set部分。我想将string分配给已创建的对象。有没有办法实现这个?

2 个答案:

答案 0 :(得分:1)

我终于明白了你想做什么。

你想要这个:

x.PluginPathSelector = "some string";

直接更改x.PluginPathSelector中现有对象的Path属性,而不是构建新的PathSelector实例并分配给x.PluginPathSelector

换句话说,你想要这个:

x.PluginPathSelector = "some string";

像你写的那样静静地处理:

x.PluginPathSelector.Path = "some string";

但是在静态转换运算符中:

static public implicit operator PathSelector(string path)

,这是无法做到的,因为这是转换运算符。

本声明:

x.PluginPathSelector = "some string";

以这种方式处理:

  1. 首先将"some string"转换为PathSelector(通过转化运算符)
  2. 将新对象分配给属性
  3. 转换运算符实现无法访问或了解它返回的对象的目标,无论是属性还是变量等等。

    所以没有。这是不可能做到的。

    如果您想避免一直构建新实例,则必须自己手动进行更改。

    x.PluginPathSelector.Path = "some string";
    

答案 1 :(得分:0)

为了完整性和黑客的方式,你可以通过使用丑陋的方式处理它:

  • 从DynamicClass继承包含PathSelector属性的类
  • 覆盖TrySetMember函数
  • 处理转换并在该函数中设置Path属性