2016-04-07 8 views
1

Ich versuche, den Wert einer benutzerdefinierten Klasse mit List<T> Eigenschaften zu erhalten, aber es löst eine Ausnahme (Objekt entspricht nicht Zieltyp.).versucht, generische Liste Eigenschaft Wert, aber gibt mir eine Ausnahme

Ich möchte zuerst überprüfen, ob der Wert Null ist, wenn nicht dann den Wert verarbeiten.

Modell:

public class CustomModel 
{ 
    public List<Foo> FooList { get; set; } 

    public List<Bar> BarList { get; set; } 

} 

Codes für die Verarbeitung der Modelldaten:

public class Result<T> 
{ 
    private readonly T _model; 

    public Result(T model) 
    { 
     _model = model; 
    } 

    private CustomObject CreateSomething(T model) 
    { 
     var obj = new CustomObject(); 

     var type = model.GetType(); 
     var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     foreach (var property in properties) 
     { 
      if (property.PropertyType.IsGenericType && 
       typeof(List<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition())) 
      { 

       //this throws an error 
       var testList = property.GetValue(this, new object[] { }); 

       //processed value will be passed to object 

       //some codes here after getting the property value 

      } 
     } 

     return obj; 
    } 
} 

Wie bekomme ich den Wert, so kann ich sie bearbeiten?

+0

getestet einfach Ihren Code und es funktioniert gut – Fabjan

+0

es nicht an meinem Ende. Es wird eine Ausnahme ausgelöst: 'Objekt stimmt nicht mit dem Zieltyp überein.' – rpmansion

+0

Können Sie mehr Code zur Verfügung stellen, in der Liste relevanter Teil dieser Klasse, auf den das Schlüsselwort' this' verweist (nicht alle Eigenschaften nur eine 'kurze Version') – Fabjan

Antwort

1

Ist es ein Tippfehler -

Es sollte var testList = property.GetValue(FooList, new object[] { }); < sein? Das Anwesen ist von dieser Stelle des Modells lesen:

var testList = property.GetValue(model, new object[] { }); 
           ^^^^^ 
+0

mein schlechtes. Es sollte das Modell sein, um den Wert einer Eigenschaft ohne Ausnahme zu erhalten. – rpmansion

1

Sie sollten die List<> zu einem generischen Typ mit MakeGenericType() machen.

Etwas wie:

var listType = typeof(List<>).MakeGenericType(new[]{typeof(T)}); 
if (property.PropertyType.IsGenericType 
    && listType.IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition())) 

Weitere Informationen über Makegenerictype: https://msdn.microsoft.com/en-us/library/system.type.makegenerictype


var testList = property.GetValue(this, new object[] { });

Sind Sie sicher, dass Sie das richtige Objekt Instanz zu übergeben? this hier? FooList

+0

Ich bekomme eine Ausnahme: 'Objekt entspricht nicht Zieltyp.' – rpmansion

Verwandte Themen