C# 约束冲突,列表<;模型<;类型1>&燃气轮机;列出<;模型<;类型2>&燃气轮机;

C# 约束冲突,列表<;模型<;类型1>&燃气轮机;列出<;模型<;类型2>&燃气轮机;,c#,generics,system.reflection,C#,Generics,System.reflection,我会尽力解释清楚的 转换: Source type: List<ConfigurationProcessFilterModel<SqlDbAccess>> Destination type: List<ConfigurationProcessFilterModel<SQLiteDbAccess>> 源类型:列表 目的地类型:列表 类型定义: abstract class BaseEntityModel<T> : INoti

我会尽力解释清楚的

转换:

Source type:      List<ConfigurationProcessFilterModel<SqlDbAccess>>
Destination type: List<ConfigurationProcessFilterModel<SQLiteDbAccess>>
源类型:列表
目的地类型:列表
类型定义:

abstract class BaseEntityModel<T> : INotifyPropertyChanged where T : IDbAccess
class ConfigurationProcessFilterModel<T> : BaseEntityModel<T> where T : IDbAccess
class SqlDbAccess : SQLBase, IDbAccess
class SQLiteDbAccess : SQLBase, IDbAccess
abstract class SQLBase
interface IDbAccess
抽象类BaseEntityModel:INotifyPropertyChanged其中T:IDbAccess
类ConfigurationProcessFilterModel:BaseEntityModel,其中T:IDbAccess
类SqlDbAccess:SQLBase,IDbAccess
类SQLiteDbAccess:SQLBase,IDbAccess
抽象类SQLBase
接口访问
我想要实现什么:

将类型为SqlDbAccess的模型列表转换为SQLiteDbAccess,反之亦然

模型转换器:

public 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).GetType().GetGenericArguments()[0];

        foreach (var sourceItem in sourceModel)
        {
            var destItem = (BaseEntityModel<TD>)Activator.CreateInstance(destInnerType);
            destModel.Add(destItem);
        }

        return destModel;
    }
}
公共类模型转换器
其中TS:SQLBase,IDbAccess
其中TD:SQLBase,IDbAccess
{
公共静态TDest转换(对象源)
其中TSource:List,new()
其中TDest:List,new()
{
var sourceModel=(TSource)source;
var destModel=new TDest();
var destinerType=typeof(TDest).GetType().GetGenericArguments()[0];
foreach(sourceModel中的var sourceItem)
{
var destem=(BaseEntityModel)Activator.CreateInstance(destinerType);
destModel.Add(destem);
}
回归模型;
}
}
来电者:

if (property.PropertyType.IsEnumerable())
{
    var innerType =
        property.PropertyType.GetGenericArguments()[0].GetGenericArguments()[0];
    if(innerType == typeof(SqlDbAccess))
    {
        //List<BaseEntityModel<SqlDbAccess>>
        var sourceType = property.PropertyType;
        var sourceModelType = sourceType.GetGenericArguments()[0];

        //List<BaseEntityModel<SQLiteDbAccess>>
        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);
        model = generic.Invoke(this, new object[] { model });
    }
}
if(property.PropertyType.IsEnumerable())
{
变量内部类型=
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(列表)
.MakeGenericType(destinationModelType);
var方法=类型(ModelConverter)
.GetMethod(“转换”);
var generic=method.MakeGenericMethod(sourceType,destinationType);
model=generic.Invoke(这个,新对象[]{model});
}
}
错误:

System.ArgumentException:“GenericArguments[0],“System.Collections.Generic.List
1[Data.Models.ConfigurationProcessFilterModel
1[Data.Database.SqlDbAccess]]”,在“TDest ConvertSource,TDest”上违反了“TSource”类型的约束

内部异常:
VerificationException:Method Data.ModelConverter
2[Data.Database.SqlDbAccess,Data.Database.SQLiteDbAccess].Convert:type参数'System.Collections.Generic.List
1[Data.Models.ConfigurationProcessFilterModel`1[Data.Database.SqlDbAccess]]违反了类型参数'TSource'的约束


通过以下定义解决:

    public static TDest Convert<TSource, TDest, TS1, TS2>(object source) where TSource : List<TS1>, new() where TDest : List<TS2>, new() where TS1 : BaseEntityModel<TS> where TS2 : BaseEntityModel<TD>
公共静态TDest转换(对象源),其中TSource:List,new()其中TDest:List,new()其中TS1:BaseEntityModel其中TS2:BaseEntityModel

为什么不
typeof(TD)
而不是
typeof(TDest).GetType().GetGenericArguments()[0]
?@ASpirin这是我的一个错误,但现在已经修复了。@NullBy7e你的示例似乎对我有效,我用你的代码添加了缺少的类主体并试图复制,我所做的唯一更改是剪切
GetType()
from
typeof(TDest).GetType().GetGenericArguments()[0]