using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
static List<BaseEntityModel<SqlDbAccess>> dbAccess
public static void Main(string[] args)
dbAccess = new List<BaseEntityModel<SqlDbAccess>>();
var property = typeof (Program).GetProperty("dbAccess", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
if (typeof (IEnumerable).IsAssignableFrom(property.PropertyType))
var innerType = property.PropertyType.GetGenericArguments()[0].GetGenericArguments()[0];
if (innerType == typeof (SqlDbAccess))
var sourceType = property.PropertyType;
var sourceModelType = sourceType.GetGenericArguments()[0];
var destinationModelType = sourceModelType.GetGenericTypeDefinition().MakeGenericType(typeof (SQLiteDbAccess));
var destinationType = typeof (List<>).MakeGenericType(destinationModelType);
var method = typeof (ModelConverter<SqlDbAccess, SQLiteDbAccess>).GetMethod("Convert");
var generic = method.MakeGenericMethod(sourceType, destinationType);
var model = generic.Invoke(null, new object[]{dbAccess});
Console.WriteLine(model);
abstract class BaseEntityModel<T> : INotifyPropertyChanged where T : IDbAccess
public event PropertyChangedEventHandler PropertyChanged;
class ConfigurationProcessFilterModel<T> : BaseEntityModel<T> where T : IDbAccess
class SqlDbAccess : SQLBase, IDbAccess
class SQLiteDbAccess : SQLBase, IDbAccess
class ModelConverter<TS, TD>
where TS : SQLBase, IDbAccess where TD : SQLBase, IDbAccess
public static TDest Convert<TSource, TDest>(object source)where TSource : List<BaseEntityModel<TS>>, new ()where TDest : List<BaseEntityModel<TD>>, new ()
var sourceModel = (TSource)source;
var destModel = new TDest();
var destInnerType = typeof (TDest).GetGenericArguments()[0];
foreach (var sourceItem in sourceModel)
var destItem = (BaseEntityModel<TD>)Activator.CreateInstance(destInnerType);