2012-02-10 1 views
5

DbContext에서 상속받은 AccessData라는 클래스의 인스턴스가 있습니다. 그래서 ... 반사를 사용리플렉션을 사용하여 이미 존재하는 개체의 Field 메서드를 호출하십시오.

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

, 나는 이런 식의 AccessData 객체에서 이러한 DbSet 호텔 중 한 곳 식별 한 ... 엔터티 프레임 워크 코드 첫 문맥 클래스이며, 다음과 같습니다

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

이제이 DbSet 속성에 개체를 추가 할 수 있어야합니다.

DbSet 필드를 나타내는 FieldInfo 개체 만 있으면 AccessData 개체에서이 특정 필드의 Add 메서드를 호출하고 개체를 전달하는 방법은 무엇입니까?

또는 다른 말로하면 어떻게 다음을 호출합니까?

accessData.<FieldInfoType>.Add(obj); 

희망적입니다. 당신이 있다면

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

을 또는 :

object fldVal = listField.GetValue(accessData); 

당신이 호출 할 방법에 대한 MethodInfo 받기 :

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

을 그리고 그것을 호출

답변

8

필드의 값을 취득합니다 .NET 4를 사용하면 새로운 dynamic 키워드를 사용하여 마지막 2 단계를 단순화 할 수 있습니다.

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

GetValue는 fieldInfo가 참조하는 개체에 대한 참조를 반환하기 때문에 이렇게 작동합니까? 나는 GetValue가 객체 자체가 아닌 값을 방금 반환했다는 것을 이름에서 추측했다. –

+0

@MatthewLock - 당신이 얻길 기대하는 _ 가치를 이해하고 있는지 잘 모르겠습니다. 'GetValue()'는 필드를 역 참조하는 것으로 정상적으로 반환되는 것을 반환합니다 (예 :'fldVal = obj.ListField;') –

+0

왜 이해가 안되나요? 반환 값 객체에서 GetType 값을 반환 한 객체에 methodInfo를 가져온 다음 Invoke를 사용하여 객체의 인스턴스에 도달합니다. 그렇게 잘 작동하는 것은 좋지만 이상하게 보입니다. –

관련 문제