2015-07-30 1 views
1

Je veux demander comment on peut comparer deux types en C#.Comment comparer 2 types similaires en C#

Mon scénario est le suivant:

Nullable<int> Rating; 
int NeedCompareType; 

Chaque fois que je compare ces deux, il retournera faux résultat. Il ya de toute façon pour moi de retourner vrai dans ce cas, car int type ont dans les deux lignes.

Ma ligne comparer est:

if(Rating.GetType() == NeedCompareType.GetType()) 

Edit: En fait, c'était mon code de programme:

public object this[string propertyName] 
    { 
     get 
     { 
      PropertyInfo property = GetType().GetProperty(propertyName); 
      return property.GetValue(this, null); 
     } 
     set 
     { 
      PropertyInfo property = GetType().GetProperty(propertyName); 
      IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true); 
      if (property.PropertyType == typeof(System.DateTime)) 
      { 
       property.SetValue(this, Convert.ToDateTime(value, culture), null); 
      } 
      else if (property.PropertyType == typeof(int)) 
      { 
       property.SetValue(this, Int32.Parse((string)value)); 
      } 
      else 
      { 
       property.SetValue(this, value, null); 
      } 

     } 
    } 

L'objectif de ce code est de jeter la valeur que le contrôleur reçoit du navigateur en tant que type de chaîne, je veux convertir en type de chaîne au type approprié d'une propriété unknown yet du modèle (dans ce cas, c'était le public Nullable<int> Rating { get; set; }).

Comme vous le savez je veux quand le propertyName = "Rating", il devrait exécuter la 2ème instruction if, mais ce ne sera pas parce que les typeof(int) et typeof(Nullable<int>) seront différentes.

Désolé pour mon mauvais anglais

+5

Leurs types * sont * différents. Quel résultat attendez-vous? Pourquoi devrait-il être vrai? – Dennis

+0

C'est pourquoi je demande comment nous pouvons y parvenir. Parce que 'Nullable ' aura de toute façon le type 'int'. –

+0

@ VũHoàngHuy: Ce sera quand il est en boîte, oui. J'ai répondu à votre question du mieux que je peux, mais c'est vraiment une question assez floue, d'autant plus que votre affirmation concernant la ligne de comparaison est incorrecte. Un programme court mais complet démontrant le problème serait vraiment utile. –

Répondre

4

En fait, cette ligne:

if(Rating.GetType() == NeedCompareType.GetType()) 

allait toujours soit dans la condition, ou jeter un NullReferenceException - parce Rating.GetType() sera encadré Rating soit une boîte Int32 ou référence nulle.

Maintenant, si vous dites que vous voulez comparer typeof(int) et typeof(Nullable<int>) vous pouvez utiliser:

public bool SomewhatEqual(Type t1, Type t2) 
{ 
    return t1 == t2 || 
      t1 == Nullable.GetUnderlyingType(t2) || 
      Nullable.GetUnderlyingType(t1) == t2; 
} 

Maintenant que nous avons vu le code que vous êtes réellement intéressé, il semble que vous voulez juste traite chaque propriété avec un type nullable comme si elle était non nullable. C'est simple:

set 
{ 
    PropertyInfo property = GetType().GetProperty(propertyName); 
    Type type = property.GetType(); 
    // Treat nullable types as their underlying types. 
    type = Nullable.GetUnderlyingType(type) ?? type; 
    // TODO: Move this to a static readonly field. No need to 
    // create a new one each time 
    IFormatProvider culture = new CultureInfo("fr-FR", true); 
    if (type == typeof(System.DateTime)) 
    { 
     property.SetValue(this, Convert.ToDateTime(value, culture), null); 
    } 
    else if (type == typeof(int)) 
    { 
     property.SetValue(this, Int32.Parse((string)value)); 
    } 
    else 
    { 
     property.SetValue(this, value, null); 
    } 
} 
+0

Pouvez-vous rel-ook un peu mon poste édité, peut-être vous pouvez m'aider à résoudre ce problème plus efficace –

+0

@ VũHoàngHuy: Voir ma modification. –

+0

Merci beaucoup, votre chemin est propre et facile à comprendre. –