2015-09-02 80 views
7

所以基本思想是:是否可以在C#中創建擴展運算符?

我們有一些商業模式

public class Model 
{ 
    public int Foo { get; set; } 
} 

而且它的視圖模型表示

public class ViewModel 
{ 
    public string Foo { get; set; } 

    public static explicit operator ViewModel(Model b) 
    { 
     // Map instances using AutoMapper or whatever 
     return new ViewModel { Foo = b.Foo.ToString() }; 
    } 
} 

我們的本能是映射模型查看模型。正如你看到的我想用explicit operator進行映射,所以我可以做

var model = new Model { Foo = 42 }; // Get model 
var viewModel = (ViewModel)model; // Map to view model 

,因此有我的控制器代碼儘可能乾淨...... 我想使視圖模型和映射邏輯分開保持。我如何將explicit operator實現移動到某個外部類?分機類似的方法:

public static class Extensions 
{ 
    public static explicit operator ViewModel(Model b) 
    { 
     // Map instances using Automapper or whatever 
     return new ViewModel { Foo = b.Foo.ToString() }; 
    } 
} 

此代碼,很明顯,沒有編譯,因爲兩個原因:
- 靜態類不能包含用戶定義的運營商
- 無論是參數或返回類型必須是擴展

此外,作爲一種選擇,我可以讓視圖模型局部和分割模型本身和運營商分離的.cs文件,但它不會讓這種情況。在架構上,它們仍然是同一個命名空間中的同一個類。我希望能夠實現映射邏輯,例如,解決方案中的另一個項目。

我只是想實現類似於擴展方法的效果。我怎樣才能做到這一點?

+2

想到的一個想法是:讓你的ViewModel成爲一個部分類,並且你有映射和模型本身的單獨文件。 – BitTickler

+0

我99.99%肯定這是不可能做與擴展方法。不過,如果你只是想分離邏輯,你可以創建一個部分類並擁有一個正常的重載操作符。 – Rob

+1

這將是可怕的程序。你能否想象添加運算符的行爲是否改變取決於你所引用的命名空間?醜陋! – Gusdor

回答

5

沒有什麼比剛剛好:如果你想改變映射邏輯

public class ModelToViewModelMapper 
{ 
    public ViewModel Map(Model b) 
    { 
     return new ViewModel { Foo = b.Foo.ToString() }; 
    } 
} 

擴展方法可以做同樣的工作,但什麼。如果你使用依賴注入和非靜態類很容易

+1

如果想象模型具有200個屬性而不是1個,那麼這看起來不再有吸引力了,是嗎? – BitTickler

+0

@BitTickler我看不到任何替代品。您可以犧牲靈活性併爲任何財產創造共同機制,但是值得這樣做的情況過於具體。 – astef

+0

是的,這很好,謝謝你的幫助,這就是我給你+1的原因,但是,正如我已經對BitTickler說的那樣 - 這裏的問題不在映射過程本身,而是將映射邏輯放置在ViewModel之外'類,但在'明確的操作符'內。我說得越多,聽起來就越不可能。 – Dmytro

2

爲什麼不這樣做MS它在System.Linq命名空間;有很多通過擴展方法完成的類型轉換(您不能用運算符來完成,C#不支持擴展運算符)。

定義以下擴展方法:

public static class Extensions 
{  
    public static ViewModel ToViewModel(this Model model) {...} 
} 

我覺得代碼保持足夠的清潔,這似乎是在這裏你的主要目標。

相關問題