繁体   English   中英

在C#中的上下转换

[英]Upcasting and Downcasting in c#

我有这样的设置:

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>类型?

当我尝试通过DbSet<Account> accountsSet = context.Accounts;来访问Accounts DbSet<Account> accountsSet = context.Accounts; ,我无法通过var tempSet = (PseudoDbSet<Account>)accountsSet将其转换为以下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] 。帐户]

这是为什么?

编辑以包含更多信息。

看下面的示例代码:

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();

        }
    }
}

它可以正常工作,因为所有类均已正确继承。

在您的代码中, PseudoDbSet继承的DbSet类出了PseudoDbSet 尝试从这两种类型中提取FullName ,并在向下转换失败的地方将它们与DbSet类型的全名进行比较。 在我的示例中,这两种类型相同,并且一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM