IWorkspace CreateWorkspace() { var assignableTargets = MakeAssignableEntities(targetObjects, selectedBackendType); object[] targetArray = assignableTargets.Any() ? assignableTargets.ToArray() : targetObjects != null ? new object[] { } : null; // make sure to pass null, NOT an empty array var ctorArguments = new object[] { selectedBackendType, targetArray, (GetAPI)window.GetAPI, (Action)window.Repaint, (Action <Action>)window.ExecOnUpdate }; var backendArguments = BackendTypeUtil.GetGenericArguments(selectedBackendType); return((IWorkspace)Activator.CreateInstance ( typeof(Workspace <,>).MakeGenericType(backendArguments), System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, ctorArguments, null )); }
static IEnumerable <object> MakeAssignableEntities(IEnumerable <object> objs, Type backendType) { if (objs == null) { yield break; } Type acceptedType = BackendTypeUtil.BackendAttrType(backendType); Type entityType = BackendTypeUtil.GetGenericArguments(backendType)[0]; foreach (var obj in objs) { if (acceptedType != null && acceptedType.IsAssignableFrom(obj.GetType())) { yield return(obj); } else { yield return(TypeUtil.MakeAssignable(obj, entityType)); } } }