Plugin interface mocking
public static class Extensions | |
{ | |
public static T Mock<T>(this Entity entity) | |
{ | |
return InterfaceMocker.Mock<T>(entity); | |
} | |
} |
static class InterfaceMocker | |
{ | |
public static T Mock<T>(Entity entity) | |
{ | |
var type = ProxyTypesCache.GetProxyType(entity.LogicalName); | |
var copy = Activator.CreateInstance(type); | |
(copy as Entity).Attributes = entity.Attributes; | |
(copy as Entity).Id = entity.Id; | |
if (typeof(T).IsAssignableFrom(type)) | |
{ | |
return (T)copy; | |
} | |
else | |
{ | |
throw new InvalidPluginExecutionException("Cannot mock interface. Target type does not implement interface " + typeof(T).Name); | |
} | |
} | |
} |
static class ProxyTypesCache | |
{ | |
private static Dictionary<string, Type> cachedTypes = new Dictionary<string, Type>(); | |
static ProxyTypesCache() | |
{ | |
var assembly = System.Reflection.Assembly.GetExecutingAssembly(); | |
var allTypes = assembly.GetExportedTypes(); | |
foreach (var type in allTypes) | |
{ | |
if (typeof(Entity).IsAssignableFrom(type)) | |
{ | |
cachedTypes.Add(type.GetCustomAttribute<EntityLogicalNameAttribute>().LogicalName, type); | |
} | |
} | |
} | |
public static Type GetProxyType(string logicalName) | |
{ | |
return cachedTypes[logicalName]; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment