2010-03-25 84 views
1

Je suis nouveau en C#, donc cela pourrait être une vraie question de vidage: j'ai implémenté IComparable dans ma classe et je veux le tester avec NUnit. Mais la méthode CompareTo est marquée comme privée et n'est donc pas accessible à partir du test.
Quelle est la raison pour cela et comment puis-je résoudre ce problème?

Le IComparable:C#: implémentation d'IComparable private


public class PersonHistoryItem : DateEntity,IComparable 
    { 
    ... 
     int IComparable.CompareTo(object obj) 
     { 
      PersonHistoryItem phi = (PersonHistoryItem)obj; 
      return this.StartDate.CompareTo(phi.StartDate); 
     } 
    } 

Le test:


     [TestMethod] 
     public void TestPersonHistoryItem() { 
      DateTime startDate = new DateTime(2001, 2, 2); 
      DateTime endDate = new DateTime(2010, 2, 2); 
      PersonHistoryItem phi1 = new PersonHistoryItem(startDate,endDate);

 PersonHistoryItem phi2 = new PersonHistoryItem(startDate, endDate); 

     Assert.IsTrue(phi1.CompareTo(phi2)==0); 
    } 


Répondre

0

Je pense que la meilleure façon serait d'utiliser la mise en œuvre de l'interface implicite:

public class PersonHistoryItem : DateEntity, IComparable 
{ 
    ... 
    public int CompareTo(object obj) 
    { 
     PersonHistoryItem phi = (PersonHistoryItem)obj; 
     return this.StartDate.CompareTo(phi.StartDate); 
    } 
} 
3

Ils ne sont pas privés, ils ne sont que explicitly implemented. Déclarant vos variables comme IComparable devrait résoudre le problème:

[TestMethod] 
public void TestPersonHistoryItem() { 
    DateTime startDate = new DateTime(2001, 2, 2); 
    DateTime endDate = new DateTime(2010, 2, 2); 
    IComparable phi1 = new PersonHistoryItem(startDate,endDate); 

    IComparable phi2 = new PersonHistoryItem(startDate, endDate); 

    Assert.IsTrue(phi1.CompareTo(phi2)==0); 
} 
+0

Merci mais je ne peux pas déclarer mes variables comme IComparable. Donc, selon votre réponse, l'autre option serait de les implanter implicitement, je suppose. Comment ferais-je cela? –

+0

Vous pouvez également les transtyper dans votre déclaration assert: 'Assert.IsTrue (((IComparable) phi1) .CompareTo ((IComparable) phi2))' –

1
var p1 = (IComparable)phi1; 
var p2 = (IComparable)phi2; 

Assert.IsTrue(p1.CompareTo(p2) == 0); 
0

En C# une interface ne définit pas accesseurs, de sorte que vous pouvez faire votre CompareTo méthode publique et changer la mise en œuvre d'interface explicite:

int IComparable.CompareTo(object obj) 

Pour:

public int CompareTo(object obj) 
0

Votre utilisation d'approche s implémentation d'interface explicite. Cela signifie que les méthodes d'interface n'apparaîtront pas sur votre classe à moins qu'une distribution ne soit effectuée. Pour ce faire: ((IComparable)phi1).CompareTo(phi2)

0

Le problème principal ici est que vous implémente explicitement la méthode CompareTo, qui vous permet uniquement de l'utiliser lorsque vous utilisez votre objet en tant qu'objet IComparable.

Pour corriger le problème, spécifiez la visibilité publique et mettre en œuvre la méthode CompareTo pas « explicitement »:

public class PersonHistoryItem : DateEntity,IComparable 
{ 
    ... 

    public int CompareTo(object obj) 
    { 
     PersonHistoryItem phi = (PersonHistoryItem)obj; 
     return this.StartDate.CompareTo(phi.StartDate); 
    } 
}