C# 向泛型转换
我正在试着将一个DbSet转换成DbSet。我的问题是,正如您在下面看到的,我试图输入一个联系人并将其转换为DbSet,但我只能返回DbSet类型的DbSet。BaseContact是Contact的超类 我怎么做这个演员?有什么建议吗C# 向泛型转换,c#,generics,C#,Generics,我正在试着将一个DbSet转换成DbSet。我的问题是,正如您在下面看到的,我试图输入一个联系人并将其转换为DbSet,但我只能返回DbSet类型的DbSet。BaseContact是Contact的超类 我怎么做这个演员?有什么建议吗 //Input: Set<Contact> -> Output: DbSet<BaseContact> public DbSet<TEntity> Set<TEntity>() where TEnti
//Input: Set<Contact> -> Output: DbSet<BaseContact>
public DbSet<TEntity> Set<TEntity>()
where TEntity : class, IObjectState
{
Return DBSet<BaseContact> as DBSet<TEntity>;
}
PS:使其非泛型是没有选择的,因为我正在通过它运行一些其他类型。以上代码并不是整个函数过程
这是全部功能:
public DbSet<TEntity> Set<TEntity>()
where TEntity : class, IObjectState
{
var propertyInfos = GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (PropertyInfo property in propertyInfos)
{
if (property.PropertyType == typeof(FakeDbSet<TEntity>))
return property.GetValue(this, null) as FakeDbSet<TEntity>;
}
var baseType = typeof(TEntity).BaseType;
while( typeof(object) != baseType )
{
foreach(var property in propertyInfos)
{
if(property.PropertyType == typeof(FakeDbSet<>).MakeGenericType(baseType))
{
var baseTypeDbSet = property.GetValue(this, null);
// you will need to convert FakeDbSet<TBaseType> to FakeDbSet<TEntity>
var entityDbSet = Convert.ChangeType(baseTypeDbSet, typeof(FakeDbSet<>).MakeGenericType(baseType)) as FakeDbSet<TEntity>;
return entityDbSet;
}
}
baseType = baseType.BaseType;
}
throw new Exception("Type collection not found");
}
泛型和继承不是这样工作的。DbSet和DbSet没有继承关系,不管Contact和BaseContact可能有什么继承关系。当您考虑要使强制转换工作,然后您有代码,当它被当作一个BDSET来处理时,可以将一个SouthExchange派生的ObjeCeCu饰件放到SET中时,这一点就更加明显了。名为DbSet的.NET EF类型不是泛型。无论如何,我不认为你能做你想做的事。C泛型没有您在这里寻找的那种变化。只是因为A类继承了B类,这并不意味着泛型类型C继承了泛型类型C。@PeterDuniho当然是:-是的,一些C泛型确实有这种变化,例如-看@Ghost Damien就在这里-如果不深入到实体并自己铸造它们,你将无法实现这一点-在任何情况下,你都无法获得来自数据库集的基本联系人的可写数据库集-这可能会导致您将公司联系人写入PersonContact集或其他任何内容-您可以从DbSet@CarstenKönig:你说得对,MSDN搜索未能为我找到DbSet的通用版本。我坚持我的意见,C泛型没有你在这里寻找的那种变化。接口泛型不能解决OP的问题。