是否可以在C#中创建扩展运算符?

时间:2015-09-02 06:59:25

标签: c#

所以基本的想法是:

我们有一些商业模式

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() }; } } 实现移动到某个外部类?与扩展方法类似:

$w.bind('resize.example', function () {
    var nw = $w.width();
    if (nw < 900) {
        nw = 900;
    }

    $c.width(nw * 3);
    $c.parent().width(nw);

}).trigger('resize.example');

显然,这个代码没有编译,原因有两个:
- 静态类不能包含用户定义的运算符
- 参数或返回类型必须是扩展名

另外,作为一个选项,我可以使视图模型部分和拆分模型本身和操作符分开 .cs 文件,但它不会成功。从架构上讲,它们仍然是同一名称空间中的同一个类。我希望能够实现映射逻辑,例如,在解决方案中的另一个项目中。

我只想实现类似于扩展方法的效果。我怎么能这样做?

2 个答案:

答案 0 :(得分:5)

没有什么比仅仅更好了:

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

扩展方法可以完成相同的工作,但是如果要更改映射逻辑会怎样。如果使用依赖注入和非静态类

将很容易

答案 1 :(得分:2)

为什么不按照 MS System.Linq命名空间中的方式执行此操作;有大量的类型转换是通过扩展方法完成的(你不能用运算符来做,C#不支持扩展运算符)。

定义以下扩展方法:

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

我认为代码仍然足够干净,这似乎是您的主要目标。