繁体   English   中英

map 使用 generics 的单独方法中的常用属性

[英]map common properties in separate method using generics

我有一个 class MechanicalData并且我有对象列表,并且在下面的 function 中我试图形成具有来自输入的值的对象列表。

Mechanicaldata class 如下所示

public class MechanicalData
{
    public List<LibraryA170> AirflowsA170 { get; set; }
    ......
}

libraryA170LibraryAcoustic如下所示

public class LibraryA170 : AEIMasterBase
{
    public string Category { get; set; }
    public string SpaceFunction { get; set; }
    [Column(TypeName = "varchar(32)")]
    public DirectExhaust? DirectExhaust { get; set; }
    .....
    ......
}

public class LibraryAcoustic : AEIMasterBase
{
    public string Category { get; set; }
    public string SpaceFunction { get; set; }
    public double? NoiseCriteria { get; set; }
    .......
}

和基础 class AEIMasterBase如下所示

public class AEIMasterBase
{
    public Guid Id { get; set; }
    public MasterSection MasterSection { get; set; }
    public List<string> NotesHTML { get; set; }
    public bool? IsApproved { get; set; }
    public Guid? InitialRevisionId { get; set; }
    public Guid? LatestRevisionId { get; set; }
    public int? Revision { get; set; }
 }

下面我正在尝试 map 所有这些字段 LINQ select

    private static MechanicalData TransformedMechanicalData(MechanicalData sourceMechanicalData, Dictionary<string, MasterSection> masterSectionMappedLibrary)
    {         
        return new MechanicalData
        {
            AirflowsA170 = sourceMechanicalData.AirflowsA170.Select(airflow170 => new LibraryA170
            {
                Id = airflow170.Id, 
                InitialRevisionId = airflow170.InitialRevisionId,
                LatestRevisionId = airflow170.LatestRevisionId,
                IsApproved = true,
                Revision = airflow170.Revision,
                NotesHTML = airflow170.NotesHTML,
                SpaceFunction = airflow170.SpaceFunction,
                Category = airflow170.Category,
                MasterSection = masterSectionMappedLibrary["Library A170"],
                ........
            }).ToList(),

            Acoustic = sourceMechanicalData.Acoustic.Select(acoustic => new LibraryAcoustic
            {
                Id = acoustic.Id,
                InitialRevisionId = acoustic.InitialRevisionId,
                LatestRevisionId = acoustic.LatestRevisionId,
                IsApproved = true,
                Revision = acoustic.Revision,
                NotesHTML = acoustic.NotesHTML,
                Category = acoustic.Category,
                SpaceFunction = acoustic.SpaceFunction,
                ......
            }).ToList()
        };
    }

有什么办法可以将两个对象传递给一个方法和 map 该方法内的公共属性,并在添加到列表时将不常见的属性映射到 select 语句中。 如果可能的话,我正在寻找类似下面的东西

public static class ItemExtensionMethods
{
    public static readonly Expression<Func<Item, MinimalItem>> MapToMinimalItemExpr = 
        source => new MinimalItem 
        {
            Id = source.Id,  // only common properties like id, revision, IsApproved 
            Property1 = source.Property1
        };
}

下面是一些常见的属性

  Id = airflow170.Id, 
  InitialRevisionId = airflow170.InitialRevisionId,
  LatestRevisionId = airflow170.LatestRevisionId,
  .......

任何人都可以对此提出任何想法,非常感谢提前

更新低于错误

在此处输入图像描述

给定两个表达式树,您想要定位两个MemberInitExpression节点,合并它们的MemberBinding并交换任何ParameterExpression

class LocateBindings : ExpressionVisitor
{
    public IEnumerable<MemberBinding> Bindings { get; private set; }
    protected override Expression VisitMemberInit(MemberInitExpression node)
    {
        Bindings = node.Bindings;
        return base.VisitMemberInit(node);
    }
}

class MergeBindings : ExpressionVisitor
{
    private IEnumerable<MemberBinding> bindings;
    private ParameterExpression parameter;
    public MergeBindings(IEnumerable<MemberBinding> bindings, ParameterExpression parameter)
    {
        this.bindings = bindings;
        this.parameter = parameter;
    }
    protected override Expression VisitMemberInit(MemberInitExpression node)
        => node.Update(node.NewExpression, 
            node.Bindings.Concat(bindings)
                .Select(VisitMemberBinding));
    protected override Expression VisitParameter(ParameterExpression node)
        => parameter;
}

public static Expression<Func<P, D>> Merge<BP, P, B, D>(
    Expression<Func<BP, B>> baseExpr,
    Expression<Func<P, D>> derivedExpr
)
    where D:B where P:BP
{
    var locate = new LocateBindings();
    locate.Visit(baseExpr);

    var merge = new MergeBindings(locate.Bindings, derivedExpr.Parameters[0]);
    return merge.VisitAndConvert(derivedExpr, "");
}

例如;

Expression<Func<[insert type], AEIMasterBase>> baseExpression = basearg => new AEIMasterBase
{
    Id = basearg.Id, 
    InitialRevisionId = basearg.InitialRevisionId,
    LatestRevisionId = basearg.LatestRevisionId,
    IsApproved = true,
    Revision = basearg.Revision,
    NotesHTML = basearg.NotesHTML,
    SpaceFunction = basearg.SpaceFunction,
};
Expression<Func<[insert type], LibraryA170>> derivedExpression = airflow170 => new LibraryA170
{
    Category = airflow170.Category,
    MasterSection = masterSectionMappedLibrary["Library A170"],
};
var merged = Merge(baseExpression, derivedExpression);

...
AirflowsA170 = sourceMechanicalData.AirflowsA170.Select(merged).ToList()
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM