Принятый ответ ограничен в том смысле, что он может работать, только если у субъекта есть хотя бы одно отношение.
Однако это также можно сделать с помощью отражения:
public ObjectContext Context(EntityObject entity) {
var relationshipManager = ((IEntityWithRelationships)entity).RelationshipManager;
var wrappedOwnerProperty = relationshipManager.GetType().GetProperty("WrappedOwner",BindingFlags.Instance | BindingFlags.NonPublic);
var wrappedOwner = wrappedOwnerProperty.GetValue(relationshipManager);
var contextProperty = wrappedOwner.GetType().GetProperty("Context");
return (ObjectContext)contextProperty.GetValue(wrappedOwner);
}
В VB.NET:
Function Context(entity As EntityObject) As ObjectContext
Dim relationshipManager = DirectCast(entity, IEntityWithRelationships).RelationshipManager
Dim wrappedOwnerProperty = relationshipManager.GetType.GetProperty("WrappedOwner", BindingFlags.Instance Or BindingFlags.NonPublic)
Return wrappedOwnerProperty.GetValue(relationshipManager).Context
End Function
Примечание: это было протестировано в .NET Framework v. 4.5.1. YMMV, поскольку это зависит от внутреннего свойства WrappedOwner
и свойства Context
для внутреннего класса BaseEntityWrapper<TEntity>
. Тем не менее, если более ранние / более поздние версии .NET имеют разные внутренние свойства / классы, это должно быть достаточно просто, чтобы сделать что-то подобное.
Примечание: это можно еще улучшить, сделав метод расширения для EntityObject
и приняв универсальный параметр для возврата строго типизированного ObjectContext
. Это также можно упростить, используя некоторый метод для получения значений свойств по имени.