Ne peut pas affecter null à des anonymes de la propriété de type array

J'ai un tableau de (Pilot) des objets avec un (Hanger) de la propriété, qui peut être nulle, ce qui en soi est un (List<Plane>) propriété. Pour des fins de test, je veux simplifier et "aplatir" ce à un anonyme, un objet avec des propriétés PilotName (string) et Planes (array) mais vous ne savez pas comment gérer un null Hanger un bien ou d'un vide PlanesList.

(Pourquoi les objets anonymes? Parce que les objets de l'API, j'suis en essais sont en lecture seule et je veux bien le tester pour être "déclarative': autonome, simple et lisible... mais je suis ouvert à d'autres suggestions. Aussi, je vais essayer d'en savoir plus sur LINQ.)

exemple

class Pilot
{
public string Name;
public Hanger Hanger;
}
class Hanger
{
public string Name;
public List<Plane> PlaneList;
}
class Plane
{
public string Name;
}
[TestFixture]
class General
{
[Test]
public void Test()
{
var pilots = new Pilot[]
{
new Pilot() { Name = "Higgins" },
new Pilot()
{
Name = "Jones", Hanger = new Hanger()
{
Name = "Area 51",
PlaneList = new List<Plane>()
{
new Plane { Name = "B-52" },
new Plane { Name = "F-14" }
}
}
}
};
var actual = pilots.Select(p => new
{
PilotName = p.Name,
Planes = (p.Hanger == null || p.Hanger.PlaneList.Count == 0) ? null : p.Hanger.PlaneList.Select(h => ne
{
PlaneName = h.Name
}).ToArray()
}).ToArray();
var expected = new[] {
new { PilotName = "Higgins", Planes = null },
new
{
PilotName = "Jones",
Planes = new[] {
new { PlaneName = "B-52" },
new { PlaneName = "F-14" }
}
}
};
Assert.That(actual, Is.EqualTo(expected));
}

Le problème immédiat est que la ligne expected... Planes = null erreurs avec,

Ne peut pas attribuer à un type de propriété, mais d'admettre le problème sous-jacent peut-être que l'utilisation null dans actual est à l'aide de null n'est pas la meilleure approche dans le premier lieu.

Des idées comment faire pour affecter la valeur null tableau dans expected ou de prendre une approche différente de celle null dans actual?

  • Le principal problème avec la mise à jour de votre exemple est parce que vous êtes à la vérification de l'égalité entre un agent recenseur (le WhereSelectArrayIterator créé par le pilots.Where appel) et un tableau. Vous pouvez utiliser ToArray() à la fin de la Where clause de force dans un tableau.
  • Le grand problème, je dirais deux choses: d'Abord, Un très bon changement à envisager serait de décisions (par exemple) Planes être un vide collection plutôt que null, quand il n'y a pas de tous les éléments. Il est beaucoup plus facile à traiter; voici de la lecture de base. Deuxièmement, je pense que vous allez avoir à prendre le contrôle d'égalité entre les résultats réels et les prévisions plus "intelligente", c'est à dire, il va devoir plonger dans les objets et les collections, et d'utiliser quelque chose comme SequenceEqual.
  • Vous avez raison, la question maintenant corrigé 🙂
  • vide collection: j'ai fait l'arrière-plan de la lecture et je suis d'accord mais je ne peux pas obtenir le changement nécessaire de la droite dans mon code. Pouvez-vous suggérer une solution? Merci. p.s. vous avez raison à propos de l'Assertion trop 🙂
  • Hmm, bien sûr, avec parfoisnull Hanger il est plus difficile... peut-être Null Objet Pattern pour cela. Pour les collections, il suffit de retourner Enumerable.Empty<type> plutôt que null.
  • J'ai ajouté ma tentative à la fin de la question, mais a une erreur de compilation. Le rclc vous proposer un correctif? Merci encore.
  • Avec ça, les deux objets dans le tableau sont en fait différents types, parce que tout Enumerable.Empty<string>() et List<string> à la fois de mettre en œuvre IEnumerable<string>, ils ne sont pas exactement du même type. Mettre .AsEnumerable() après la new List<>() et il compile
  • l'a obtenu. Merci encore à tous pour votre aide.

InformationsquelleAutor petemoloy | 2013-01-14