2017-06-29 51 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 *。 –

相關問題