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.List1[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()
fromtypeof(TDest).GetType().GetGenericArguments()[0]代码>