2012-02-10 48 views
5

Tôi có một thể hiện của một lớp được gọi là AccessData, được kế thừa từ DbContext. Vì vậy, nó là một mã Entity Framework đầu tiên lớp bối cảnh và trông như thế này ...Sử dụng phản chiếu, gọi phương thức của một Trường trên đối tượng đã tồn tại

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

Sử dụng Reflections, tôi đã xác định được một trong những thuộc tính DbSet trên đối tượng AccessData như thế này ...

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

Bây giờ tôi cần có thể thêm đối tượng vào thuộc tính DbSet này.

Vì tôi chỉ có đối tượng FieldInfo đại diện cho trường DbSet, làm cách nào để gọi phương thức Thêm của trường cụ thể này trên đối tượng AccessData và truyền vào đối tượng?

Hoặc nói cách khác làm cách nào để gọi những điều sau?

accessData.<FieldInfoType>.Add(obj); 

Hy vọng điều này có ý nghĩa.

Trả lời

8

Nhận giá trị của lĩnh vực:

object fldVal = listField.GetValue(accessData); 

Lấy MethodInfo cho phương pháp mà bạn muốn gọi:

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

Và gọi nó:

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

Hoặc nếu bạn đang sử dụng .NET 4, bạn có thể sử dụng từ khóa dynamic mới để đơn giản hóa 2 bước cuối cùng:

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

Vì vậy, điều này có tác dụng vì GetValue trả về tham chiếu đến đối tượng mà fieldInfo đang đề cập đến? Tôi đã giả định từ cái tên mà GetValue vừa trả về một giá trị chứ không phải là bản thân đối tượng hay cái gì đó. –

+0

@MatthewLock - Tôi không hoàn toàn chắc chắn rằng tôi hiểu những gì _value_ bạn mong đợi để có được. 'GetValue()' sẽ trả lại bất cứ điều gì bình thường sẽ được trả về bởi dereferencing trường (ví dụ 'fldVal = obj.ListField;') –

+0

Điều tôi không hiểu là tại sao bạn có thể gọi GetType() trên đối tượng giá trị trả về và có thể để có được một methodInfo trên đối tượng trả về giá trị, và sau đó đến được thể hiện của đối tượng bằng cách sử dụng Invoke. Thật tuyệt vời khi nó hoạt động như thế, nhưng nó có vẻ kỳ quặc. –

Các vấn đề liên quan