1

API からデータを読み取るときにコードを削減しようとしています。非常によく似た方法がたくさんありますが、それらを 1 つにリファクタリングできると確信しています。正しい方向に向ける必要があるだけです。以下はコードの非常に単純化されたバージョンです -

「ReturnManagerName」と「ReturnTrainerName」を 1 つのメソッドにリファクタリングしたいのですが、誰か助けてもらえますか?

void Main()
{
  Team team = new Team();

  Manager manager = new Manager();
  manager.ManagerName = "Mr Manager";

  team.TeamManager = manager;

  Console.WriteLine ("Manager: " + ReturnManagerName(team));
  Console.WriteLine ("Trainer: " + ReturnTrainerName(team));
}

string ReturnManagerName(Team team)
{
  if(team.TeamManager == null)
    return "None";
  return team.TeamManager.ManagerName;
}

string ReturnTrainerName(Team team)
{
  if(team.TeamTrainer == null)
    return "None";
  return team.TeamTrainer.TrainerName;
}

public class Team
{
  public Manager TeamManager { get; set; }
  public Trainer TeamTrainer { get; set; }
}

public class Manager
{
  public string ManagerName { get; set; }
}

public class Trainer
{
  public string TrainerName { get; set; }
}

ご協力いただきありがとうございます。

4

3 に答える 3

1

次のようなリフレクションを使用してそれを行うことができます。

string ReturnTeamMemberName(object manager, string propName)
{
   if(manager == null)
      return "None";      
   return manager.GetType().GetProperty(propName).GetValue(manager, null).ToString();
}

のように呼びます。

Console.WriteLine ("Manager: " + ReturnTeamMemberName(team.TeamManager, "ManagerName"));
Console.WriteLine ("Trainer: " + ReturnTeamMemberName(team.TeamTrainer,"TrainerName" ));
于 2013-11-13T10:27:21.830 に答える
1

コメントに従って更新:

public class Person 
{
    public Person(string name)
    {
        Name = name;
    }

    public string Name { get; set; }
}


public class Team
{
    public Person Manager { get; set; }
    public Person Trainer { get; set; }
}

public class PrettyPrinter
{
    public string GetNameOrNone(Person p)
    {
        return p != null ? p.Name : "None";
    }

}

そしてメインで:

{
    Team team = new Team();

    team.Manager = new Person("Mr. Manager");

    PrettyPrinter p = new PrettyPrinter();

    Console.WriteLine ("Manager: " + p.GetNameOrNone(team.Manager));
    Console.WriteLine ("Trainer: " + p.GetNameOrNone(team.Trainer));
}
于 2013-11-13T10:38:00.923 に答える
0

あなたはこれを行うことができます:

Tuple<string,string> ReturnNames(Team team)
{
  var trainerName = (team.TeamTrainer == null)? "None" : team.TeamTrainer.TrainerName;
  var managerName = (team.TeamTrainer == null)? "None" : team.TeamManager.ManagerName;
  return Tuple.Create(trainerName, managerName);
}

var tuple = ReturnNames(team);
Console.WriteLine ("Manager: " + tuple.Item1 );
Console.WriteLine ("Trainer: " + tuple.Item2 );

しかし、これは本当にあなたに何かをもたらしますか? そのままで完全に読めるものに複雑さを加えているだけのようです。

于 2013-11-13T10:26:21.593 に答える