Imports System.Runtime.CompilerServices Imports System.Data.Objects.DataClasses Imports System.Runtime.Serialization Imports System.IO Imports System.Reflection Imports System.Runtime.Serialization.Formatters.Binary Namespace Extensiones Public Module EntityExtensions ''' ''' Extension method to Enitity Object. ''' Deeply clone the Object. ''' ''' Entity Object need to be cloned ''' The cloned object Public Function Clone(Of T As EntityObject)(ByVal source As T) As T Dim ser As New DataContractSerializer(GetType(T)) Using stream As MemoryStream = New MemoryStream ser.WriteObject(stream, source) stream.Seek(0, SeekOrigin.Begin) Return DirectCast(ser.ReadObject(stream), T) End Using End Function Public Function ClearEntityObject(Of T As Class)(ByVal source As T, ByVal bCheckHierarchy As Boolean) As T If (source Is Nothing) Then Throw New Exception("Null Object cannot be cloned") End If Dim tObj As Type = source.GetType If (Not tObj.GetProperty("EntityKey") Is Nothing) Then tObj.GetProperty("EntityKey").SetValue(source, Nothing, Nothing) End If If bCheckHierarchy Then Dim PropertyList As List(Of PropertyInfo) = Enumerable.ToList(Of PropertyInfo)((From a In source.GetType.GetProperties Where a.PropertyType.Name.Equals("ENTITYCOLLECTION`1", StringComparison.OrdinalIgnoreCase) Select a)) Dim prop As PropertyInfo For Each prop In PropertyList Dim keys As IEnumerable = DirectCast(tObj.GetProperty(prop.Name).GetValue(source, Nothing), IEnumerable) Dim key As Object For Each key In keys 'Dim kk = ((From a In key.GetType.GetProperties 'Where (a.PropertyType.Name.Equals("EntityReference`1", StringComparison.OrdinalIgnoreCase)) ' Select a)) 'Dim ochildprop = (From a In key.[GetType]().GetProperties() Where a.PropertyType.Name = "EntityReference`1").SingleOrDefault() Dim childProp As EntityReference = Enumerable.FirstOrDefault(Of PropertyInfo)((From a In key.GetType.GetProperties Where (a.PropertyType.Name.Equals("EntityReference`1", StringComparison.OrdinalIgnoreCase)) Select a)).GetValue(key, Nothing) ClearEntityObject(childProp, False) ClearEntityObject(key, True) Next Next End If Return source End Function ''' ''' Clear the entity of object and all related child objects ''' ''' Entity Object need to be cleared ''' This parameter is used to determine whether to clear all the child object ''' Public Function ClearEntityReference(ByVal source As EntityObject, ByVal bCheckHierarchy As Boolean) As EntityObject Return ClearEntityObject(source, bCheckHierarchy) End Function Public Function LoadAllChild(source As EntityObject) As EntityObject Dim PropList As List(Of PropertyInfo) = (From a In source.[GetType]().GetProperties() Where a.PropertyType.Name = "EntityCollection`1").ToList() For Each prop As PropertyInfo In PropList Dim instance As Object = prop.GetValue(source, Nothing) Dim isLoad As Boolean = CBool(instance.[GetType]().GetProperty("IsLoaded").GetValue(instance, Nothing)) If Not isLoad Then Dim mi As MethodInfo = (From a In instance.[GetType]().GetMethods() Where a.Name = "Load" AndAlso a.GetParameters().Length = 0).FirstOrDefault() mi.Invoke(instance, Nothing) End If Next Return DirectCast(source, EntityObject) End Function Public Function DeepClone(Of T As EntityObject)(ByVal source As T) As T Using ms = New MemoryStream() Dim formatter = New BinaryFormatter() formatter.Serialize(ms, source) ms.Position = 0 Return DirectCast(formatter.Deserialize(ms), T) End Using End Function ' 'Public Function ToDataTable(Of T As Class)(ByVal Lista As List(Of T)) As DataTable ' Dim dt As New DataTable(GetType(T).Name) ' Dim props = GetType(T).GetProperties(BindingFlags.Public Or BindingFlags.Instance) ' For Each p In props ' Next 'End Function Public Function ObtieneContexto(entity As Objects.DataClasses.EntityObject) As Objects.ObjectContext Dim relationshipManager = DirectCast(entity, Objects.DataClasses.IEntityWithRelationships).RelationshipManager Dim wrappedOwnerProperty = relationshipManager.GetType.GetProperty("WrappedOwner", Reflection.BindingFlags.Instance Or BindingFlags.NonPublic) Return wrappedOwnerProperty.GetValue(relationshipManager).Context End Function End Module End Namespace