C# c语言中的上、下转换#
我有这样的设置:C# c语言中的上、下转换#,c#,casting,C#,Casting,我有这样的设置: public class PseudoContext : DbContext { public DbSet<Account> Accounts {get; set;} public PseudoContext() { Accounts = new PseudoDbSet<Account>(); } } public class PseudoDbSet<T> : DbSet<T>
public class PseudoContext : DbContext
{
public DbSet<Account> Accounts {get; set;}
public PseudoContext()
{
Accounts = new PseudoDbSet<Account>();
}
}
public class PseudoDbSet<T> : DbSet<T> {}
公共类伪上下文:DbContext
{
公共数据库集帐户{get;set;}
公共伪上下文()
{
Accounts=新的伪数据库集();
}
}
公共类伪DbSet:DbSet{}
所以在运行时,帐户
应该是伪数据库集
类型
当我试图通过DbSet accountsSet=context.Accounts访问账户时代码>,我无法通过var tempSet=(PseudoDbSet)accountsSet将其向下转换为,我得到以下运行时异常:
测试方法RoleManager Test.PseudoContextTest.Add_ValidAccount_AccountAdded引发异常:System.InvalidCastException:无法将类型为“System.Data.Entity.DbSet 1[RoleManager.Models.Account]”的对象强制转换为类型为“RoleManager.Models.PseudoDbSet 1[RoleManager.Models.Account]
为什么呢
编辑以包含更多信息。查看以下示例代码:
using System;
namespace Demo
{
public class DbSet<T> { }
public class Account { }
public class PseudoContext
{
public DbSet<Account> Accounts {get; set;}
public PseudoContext()
{
Accounts = new PseudoDbSet<Account>();
}
}
public class PseudoDbSet<T> : DbSet<T> {}
class Program
{
static void Main(string[] args)
{
PseudoContext ct = new PseudoContext();
PseudoDbSet<Account> db = (PseudoDbSet<Account>)ct.Accounts;
Console.WriteLine(typeof(PseudoDbSet<Account>).FullName);
Console.WriteLine(ct.Accounts.GetType().FullName);
Console.ReadLine();
}
}
}
使用系统;
名称空间演示
{
公共类DbSet{}
公共类帐户{}
公共类伪上下文
{
公共数据库集帐户{get;set;}
公共伪上下文()
{
Accounts=新的伪数据库集();
}
}
公共类伪DbSet:DbSet{}
班级计划
{
静态void Main(字符串[]参数)
{
伪上下文ct=新的伪上下文();
PseudoDbSet db=(PseudoDbSet)ct.Accounts;
Console.WriteLine(typeof(PseudoDbSet.FullName);
Console.WriteLine(ct.Accounts.GetType().FullName);
Console.ReadLine();
}
}
}
它工作正常,因为所有类都被正确继承
在代码中,PseudoDbSet
继承的DbSet
类有问题。尝试从这两种类型中拉出FullName
,并在向下播放失败的位置将它们与DbSet
类型的全名进行比较。在我的示例中,这两种类型是相同的,一切正常。InvalidCastException“不是编译器错误,也没有发生任何强制转换。。请包括实际的错误消息和/或故障指示器。这里是:测试方法RoleManager.PseudoContextTest.Add_ValidAccount_AccountAdded抛出异常:System.InvalidCastException:无法将类型为“System.Data.Entity.DbSet 1[RoleManager.Models.Account]”的对象强制转换为类型为“RoleManager.Models.PseudoDbSet 1”[RoleManager.Models.Account]。
在尝试var tempSet=(PseudoDbSet)时进行强制转换accountsSet
。听起来更像是反向的,您试图将一些未知的数据库集转换为伪数据库集,这可能会失败。请记住,在编译时这些都是未知的。@Andreas Müller感谢您的提示,我更新了问题。@AndreasMüller不,更改确实在问题中:)我发现了问题。实际上,我使用了DbSet accountSet=context.Set();
不重写伪上下文中的Set()
。谢谢!