所以基本思想是:是否可以在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文件,但它不會讓這種情況。在架構上,它們仍然是同一個命名空間中的同一個類。我希望能夠實現映射邏輯,例如,解決方案中的另一個項目。
我只是想實現類似於擴展方法的效果。我怎樣才能做到這一點?
想到的一個想法是:讓你的ViewModel成爲一個部分類,並且你有映射和模型本身的單獨文件。 – BitTickler
我99.99%肯定這是不可能做與擴展方法。不過,如果你只是想分離邏輯,你可以創建一個部分類並擁有一個正常的重載操作符。 – Rob
這將是可怕的程序。你能否想象添加運算符的行爲是否改變取決於你所引用的命名空間?醜陋! – Gusdor