c#中的上传和下传

时间:2014-07-15 09:57:00

标签: c# casting

我有这样的设置:

public class PseudoContext : DbContext
{
    public DbSet<Account> Accounts {get; set;}

    public PseudoContext()
    {
        Accounts = new PseudoDbSet<Account>();
    }
}

public class PseudoDbSet<T> : DbSet<T> {}

因此,在运行时,Accounts的类型应为PseudoDbSet<Account>

当我尝试通过Accounts访问DbSet<Account> accountsSet = context.Accounts;时,我无法通过var tempSet = (PseudoDbSet<Account>)accountsSet向下转发,我得到以下运行时异常:

  

测试方法RoleManagerTest.PseudoContextTest.Add_ValidAccount_AccountAdded引发异常:System.InvalidCastException:无法将类型为'System.Data.Entity.DbSet 1 [RoleManager.Models.Account]'的对象强制转换为'RoleManager.Models.PseudoDbSet 1 [ RoleManager.Models.Account]

为什么?

编辑以包含更多信息。

1 个答案:

答案 0 :(得分:0)

请看这个示例代码:

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继承了PseudoDbSet类的错误。尝试从这两种类型中提取FullName,并在向下转发失败的位置将它们与DbSet类型的全名进行比较。在我的例子中,这两种类型是相同的,一切都很顺利。