2012-02-10 12 views
5

Mam instancję klasy o nazwie AccessData, która dziedziczy po DbContext. Więc to jest kod pierwszej klasy kontekstu Entity Framework i wygląda tak ...Używając odbicia, wywołaj metodę pola na obiekcie, który już istnieje.

public class AccessData : DbContext 
{ 
    public DbSet<apps_Apps> apps_AppsList; 
    public DbSet<apps_AppsOld> apps_AppsOldList; 
    ... 
    //Several other DbSet<> properties 
} 

Korzystanie refleksje, mam zidentyfikować jeden z tych właściwości DbSet na obiekcie AccessData jak to ...

var listField = accessData.GetType().GetField(typeName + "List"); 

Muszę teraz móc dodawać obiekty do tej właściwości DbSet.

Biorąc pod uwagę, że mam tylko obiekt FieldInfo, który reprezentuje pole DbSet, w jaki sposób wywołać metodę Add tego pola w obiekcie AccessData i przekazać obiekt?

Innymi słowy, jak mogę połączyć się z następującymi?

accessData.<FieldInfoType>.Add(obj); 

Mam nadzieję, że to ma sens.

Odpowiedz

8

Get wartość pola:

object fldVal = listField.GetValue(accessData); 

Pobierz MethodInfo dla metody, którą chcesz wywołać:

MethodInfo addMethod = fldVal.GetType().GetMethod("Add", new Type[] { typeof(obj) }); 

i wywołać go:

addMethod.Invoke(fldVal, new object[] { obj }); 

lub jeśli jesteś przy użyciu platformy .NET 4 możesz użyć nowego słowa kluczowego dynamic, aby uprościć 2 ostatnie kroki:

dynamic fldVal = listField.GetValue(accessData); 
fldVal.Add(obj); 
+0

Czyli to działa, ponieważ GetValue zwraca odwołanie do obiektu, do którego odnosi się poleInfo? Zakładam, że od nazwy GetValue właśnie zwrócono wartość, a nie sam obiekt lub coś takiego. –

+0

@MatthewLock - Nie jestem do końca pewny, czy rozumiem, jaką wartość należy się spodziewać. 'GetValue()' zwróci to, co normalnie zostanie zwrócony przez dereferencję pola (np. 'FldVal = obj.ListField;') –

+0

Nie rozumiem, dlaczego możesz wywołać metodę GetType() na zwracanym obiekcie wartości i być w stanie aby uzyskać metodę methodIn na obiekcie, który zwrócił wartość, a następnie osiągnąć instancję obiektu za pomocą Invoke. To wspaniałe, że działa tak, ale wydaje się dziwne. –

Powiązane problemy