如何在Expression <func <... =“”>&gt;?</func <>中重用代码

时间:2014-07-23 01:47:13

标签: c# linq lambda

我是表达新手,我和他们一起玩。

将此表达式用于Linq to Entities context.Products.Select(AsProductDto)

internal static readonly Expression<Func<Product, ProductDto>> 
    AsProductDto = product => new ProductDto 
    {
       // repeated code 
       Name = product.name 
       // ...
    };

我也想要这个构造函数:

public class ProductDto {
    public ProductDto() { }
    public ProductDto(Product product) 
    {
       // repeated code 
       Name = product.name 
       // ...
    }
}

因为Linq to Entities中无参数构造函数的要求我无法使用

internal static readonly Expression<Func<Product, ProductDto>> 
        AsProductDto = product => new ProductDto(product)

无论如何,我可以重复使用(又不重复)标记为重复的代码部分吗?

2 个答案:

答案 0 :(得分:3)

为了删除一些重复内容,您可能会为Product类中的ProductDto引入一个setter

这种方法可以帮助您减少大部分重复的行,

只有当你有几行复制时,这才有用。复制产品的几个属性。

例如

    internal static readonly Expression<Func<Product, ProductDto>>
        AsProductDto = product => new ProductDto
        {
            // single line call to setter
            Product = product
        };

    public class ProductDto
    {
        public ProductDto() { }
        public ProductDto(Product product)
        {
            // single line call to setter
            Product = product;
        }
        public ProductDto Product
        {
            set
            {
                // no more repeated code 
                Name = value.name;
                // ...
            }
        }
    }

答案 1 :(得分:0)

只需添加一个向对象添加产品的功能,您就可以从任何想要的地方调用它。

public class ProductDto {
    public ProductDto() { }
    public ProductDto(Product product) 
    {
        AddProduct(product)
    }
    public AddProduct(Product product)
    {
        Name = product.name
    }
}

同样适用于上述代码