2017-10-25 1 views
-1

Ich debugge den Quellcode von jemand anderem, und ich bin nicht wirklich sicher, wie es funktioniert, also bin ein bisschen fest.Fehler bei der Verwendung der Aktion (T, Objekt)

Dieser Code:

List<string> source = new List<string>(); 
for (int ordinal = 0; ordinal < dbDataReader.FieldCount; ++ordinal) 
    source.Add(dbDataReader.GetName(ordinal)); 
var list = source.Select(n => new { 
            n = n, 
            prop = props.FirstOrDefault<DB.PropInfo<T>>((Func<DB.PropInfo<T>, bool>)(p => string.Equals(p.Name, n, StringComparison.Ordinal))) 
            ?? props.FirstOrDefault<DB.PropInfo<T>>((Func<DB.PropInfo<T>, bool>)(p => string.Equals(p.Name, n, StringComparison.OrdinalIgnoreCase))) 
            } 
         ) 
       .Select(param0 => new { Name = param0.n, Property = param0.prop }) 
       .ToList(); 

while (dbDataReader.Read()) 
{ 
    T instance = Activator.CreateInstance<T>(); 
    foreach (var data in list) 
     data.Property.Setter(instance, Convert.ChangeType(dbDataReader[data.Name], data.Property.Type)); // ERROR HERE 
    objList.Add(instance); 
} 

wirft diese Ausnahme:

Argument: Statische Eigenschaft erfordert null Instanz, nicht-statische Eigenschaft erfordert nicht-null-Instanz. Parametername: Eigenschaft

Die Variablen instance und data alle haben, was aussehen gültige Werte.

Was ist hier falsch, bitte?

+1

Scheint, als würden Sie eine 'statische' Eigenschaft in Ihre Liste aufnehmen Wenn es unerwünscht ist, filtern Sie es aus. Wenn dies der Fall ist, müssen Sie 'null' anstelle von 'instance' an – haim770

+0

data.Property übergeben ;} öffentliche Aktion Setter {get; set;} öffentlichen Typ Typ {get; set;}} so nicht statisch. – radders

+0

Übergabe von null anstelle von Instanzenerträgen: Fehler CS1503: Argument 1: kann nicht von '' in 'T' konvertiert werden – radders

Antwort

0

Was ist mit einer schnellen schmutzigen Lösung?

foreach (var data in list) 
{ 
    try 
    { 
     data.Property.Setter(instance, Convert.ChangeType(dbDataReader[data.Name], data.Property.Type)); 
    } 
    catch(ArgumentException e) 
    { 
     data.Property.Setter(default(T), Convert.ChangeType(dbDataReader[data.Name], data.Property.Type)); 
    } 
} 
+0

Übergeben von null anstelle von Instanzenerträgen: Fehler CS1503: Argument 1: Konvertieren von '' zu 'T' – radders

+0

Sie können Standard (T) anstelle von Null in einem generischen Code verwenden. –

+0

Vielleicht können Sie hinzufügen, wo T: -Klasse-Klausel zur Definition der generischen Methode/Klasse. Das sollte Ihnen ermöglichen, null zu verwenden. –

0

Ok, also habe ich das Problem gefunden. Es war tatsächlich innerhalb des Setter selbst - der Code, den ich erhielt, war nicht die neueste Version ... ;-( Danke für alle Vorschläge.

Verwandte Themen