Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向泛型转换_C#_Generics - Fatal编程技术网

C# 向泛型转换

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

我正在试着将一个DbSet转换成DbSet。我的问题是,正如您在下面看到的,我试图输入一个联系人并将其转换为DbSet,但我只能返回DbSet类型的DbSet。BaseContact是Contact的超类

我怎么做这个演员?有什么建议吗

//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的问题。