2009-05-14 40 views
6

Ich verwende Reflektion, um die Eigenschaften eines Objekts zu füllen.Festlegen der Eigenschaften eines Objekts durch Reflektion mit verschiedenen Eigenschaften

Diese Eigenschaften haben unterschiedliche Typen: String, Nullable (double) und Nullable (long) (ich weiß nicht, wie man hier den spitzen Klammern entkommt ...). Die Werte für diese Eigenschaften stammen aus einem Wörterbuch mit (String-, Objekt-) Paaren.

So zum Beispiel meine Klasse hat die folgenden Eigenschaften:

string Description { get; set; } 
Nullable<long> Id { get; set; } 
Nullable<double> MaxPower { get; set; } 

(in Wirklichkeit gibt etwa ein Dutzend Objekte sind) und das Wörterbuch wird Einträge wie < „Beschreibung“, „Eine Beschreibung“>, < "Id", 123456>, < "MaxPower", 20000>

Jetzt habe ich so etwas wie die folgenden verwende die Werte zu setzen:

foreach (PropertyInfo info in this.GetType().GetProperties()) 
{ 
    if (info.CanRead) 
    { 
     object thisPropertyValue = dictionary[info.Name]; 

     if (thisPropertyValue != null && info.CanWrite) 
     { 
      Type propertyType = info.PropertyType; 

      if (propertyType == typeof(String)) 
      { 
       info.SetValue(this, Convert.ToString(thisPropertyValue), null); 
      } 
      else if (propertyType == typeof(Nullable<double>)) 
      { 
       info.SetValue(this, Convert.ToDouble(thisPropertyValue), null); 
      } 
      else if (propertyType == typeof(Nullable<long>)) 
      { 
       info.SetValue(this, Convert.ToInt64(thisPropertyValue), null); 
      } 
      else 
      { 
       throw new ApplicationException("Unexpected property type"); 
      } 
     } 
    } 
} 

Die Frage ist also: muss ich wirklich den Typ jeder Eigenschaft überprüfen, bevor Sie den Wert zuweisen? Gibt es so etwas wie einen Cast, den ich ausführen kann, damit dem Eigenschaftswert der Typ der entsprechenden Eigenschaft zugewiesen wird?

Im Idealfall würde Ich mag Lage sein, etwas zu tun wie die folgenden (die ich naiverweise gearbeitet haben vielleicht gedacht):

  if (thisPropertyValue != null && info.CanWrite) 
     { 
      Type propertyType = info.PropertyType; 

      if (propertyType == typeof(String)) 
      { 
       info.SetValue(this, (propertyType)thisPropertyValue, null); 
      } 
     } 

Danke, Stefano

Antwort

10

Sind die Werte bereits von der richtige Typ, dann nein: Sie müssen nichts tun. Wenn sie nicht richtig sein könnte (int vs float, etc.), die ein einfacher Ansatz könnte sein:

(bearbeiten für NULL-Werte eingestellt)

Type propertyType = info.PropertyType; 
if (thisPropertyValue != null) 
{ 
    Type underlyingType = Nullable.GetUnderlyingType(propertyType); 
    thisPropertyValue = Convert.ChangeType(
     thisPropertyValue, underlyingType ?? propertyType); 
} 
info.SetValue(this, thisPropertyValue, null); 
+0

Ich wollte nur versuchen, info.SetValue vorschlagen (this, thisPropertyValue, null); aber das scheint eine bessere Lösung zu sein. – ChrisF

+0

+1 für die Convert.ChangeType-Methode. Es ist eine großartige Lösung, um die Wenns im Code zu vermeiden. –

+0

@Marc: Danke, das hat den Trick;) @ ChrisF: info.SetValue (thisPropertyValue, null) ausgelöst eine Ausnahme beim Versuch, von Int zu Double in einem meiner Testfälle zu konvertieren. –

Verwandte Themen