2017-06-29 18 views
0

我试图为对象实现一些隐式转换。目前,我这样做:在C#中隐式转换而不创建新对象

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分配给已创建的对象。有没有办法来实现这个?

+0

那么有到不变性(!每次又名创建一个新的对象)的许多好处。由于该方法的静态特性,没有实例抢 - 点是,你可以在任何使用方法点。你应该在你的对象上创建一个方法来合并它们。 –

+4

如何设置PluginPath,设置PluginPathSelector.Path属性(与获取它相同),我没有理由在此处进行隐式转换。实际上我只是看到代码的问题,因为PathSelector是一个实现INotifyPropertyChanged的类(并且实际上它检查了Path在setter中的等价性) – Icepickle

+0

@Ippickle这就是我所做的。但我想实现隐式强制转换,以便在绑定场景中更方便地使用对象 –

回答

1

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

你想这样的:

x.PluginPathSelector = "some string"; 

现有对象的Path属性中直接更改,而不是构建一个新的PathSelector实例,并分配给x.PluginPathSelectorx.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. 分配新对象的属性

转换运算符实现无法达到或了解它返回的对象的目标,无论是属性还是变量或其他。

所以没有。这是无法完成的。

如果您想避免构建新的实例,您将不得不自己手动进行更改。

x.PluginPathSelector.Path = "some string"; 
+1

提示,你可以让'PathSelector'成为一个不可变的结构,那么你不会创建* instances *。 –