根据条件为对象赋值

时间:2017-11-08 08:08:36

标签: c# linq if-statement reduce

我使用以下方法为我的对象赋值(Team.Driver / Team.Codriver)。这很好但只是想知道我是否可以通过LINQ或其他选项来改进这段代码。

public void MoveDriverCodriver(
    Team source, string sourceType, Team target, string targetType) 
{
    if (sourceType == "Driver")
    {
        if (targetType == "Driver")
        {
            target.Driver = source.Driver;
        }
        else
        {
            target.Codriver = source.Driver;
        }
    }
    else
    {
        if (targetType == "Driver")
        {
            target.Driver = source.Codriver;
        }
        else
        {
            target.Codriver = source.Codriver;
        }
    } 
}

第二部分是我想用适当的源更新目标Driver / Codriver细节。但我想保留目标Driver / Codriver的身份。

class Driver
{
  public Guid Id { get; set; }
  public string Firstname { get; set; }
  public string Lastname { get; set; }
  public int Age { get; set; }
}

class Team
{
  public Guid Id { get; set; }
  public Driver Driver { get; set; }
  public Driver Codriver { get; set; }
}

调用移动操作。

Team team1 = new Team(); //Do some operation on team1
Team team2 = new Team(); //Do some operation on team2
MoveDriverCodriver(team1, "driver", team2, "codriver"); //Here I am trying to assign team1's driver to team2's codriver.

3 个答案:

答案 0 :(得分:1)

您可以使用反射,并使您的方法适用于任何类型:

public void MoveDriverCodriver(
    object source, string sourceType, object target, string targetType) 
{
    if(targetType.ToLower() != "id")
    {
        var targetInfo = target.GetType().GetProperty(targetType); 
        var sourceInfo = source.GetType().GetProperty(sourceType); 
        if (targetInfo != null && sourceInfo != null && targetInfo.PropertyType == sourceInfo.PropertyType) 
            targetInfo.SetValue(target, sourceInfo.GetValue(source));   
    }
}

答案 1 :(得分:-1)

是否分配给DriverCodrivertargetType决定。因此,反转检查,您可以简化代码:

public void MoveDriverCodriver(
    Team source, string sourceType, Team target, string targetType) 
{
    if (targetType == "Driver")
    {
        target.Driver = sourceType == "Driver" ? source.Driver : source.Codriver;
    }
    else
    {
        target.Codriver = sourceType == "Driver" ? source.Driver : source.Codriver;
    }
}

如果您使用的是C#7,则可以使用本地功能进一步减少重复:

public void MoveDriverCodriver(
    Team source, string sourceType, Team target, string targetType) 
{
    if (targetType == "Driver")
    {
        target.Driver = ChooseDriver();
    }
    else
    {
        target.Codriver = ChooseDriver();
    }

    DriverType ChooseDriver() => sourceType == "Driver" ? source.Driver : source.Codriver;
}

再次使用C#7,你可以通过使用元组和解构来进一步减少它:

public void MoveDriverCodriver(
    Team source, string sourceType, Team target, string targetType) 
{
    (target.Driver, target.Codriver) = targetType == "Driver"
        ? (ChooseDriver(), target.Codriver)
        : (target.Driver, ChooseDriver());

    DriverType ChooseDriver() => sourceType == "Driver" ? source.Driver : source.Codriver;
}

但我个人并没有走得那么远,因为你现在处于为了节省几行而必须将一个项目的价值分配回自身的领域。因此,在这个阶段,我们想知道不要简化为“聪明”的领域。代码,即使其变得更复杂只是为了缩短它。

答案 2 :(得分:-2)

你可以这样做:

        public void MoveDriverCodriver(
Team source, string sourceType, Team target, string targetType)
    {
        target.Driver = targetType == "Driver" ? sourceType == "Driver" ? source.Driver : source.Codriver : null;
        target.Codriver = targetType != "Driver" ? sourceType == "Driver" ? source.Driver : source.Codriver : null;
    }
相关问题