繁体   English   中英

向下转换C#.NET

[英]Downcasting C# .NET

这是我的示例:

public class Person
{
    public string Name { get; set; }
}

public class Client : Person
{
    public string LastName { get; set; }
}

public class Test
{
    Person p = new Person();
    Client c = (Client)p; //throws exception
}

由于客户是从Person继承的,为什么我不能这样做? 如果我可以并且这是错误的方式,我该怎么办?

OBS:我知道上面的示例可以做到:

Person p = new Client();
Client c = (Client)p;

实际上,绕了一点弯路,您就可以进行这种转换,但是,对于其他两个类,它都需要一个额外的父类,并且需要一个隐式运算符才能将Client转换为Person(尽管这可能不是您最初想要的)

class Program
{
    public abstract class BasePerson
    {
        public string FirstName { get; set; }
    }

    public class Person : BasePerson
    {
    }

    public class Client : BasePerson
    {
        public string LastName { get; set; }

        public static implicit operator Client(Person p)
        {
            if (p == null)
            {
                return null;
            }
            return new Client { FirstName = p.FirstName };
        }
    }

    static void Main(string[] args)
    {
        Person p = new Person { FirstName = "Test" };
        Client c = (Client)p;
        Console.WriteLine(c.FirstName);
        Console.ReadLine();
    }
}

它将编译并将FirstName提供给客户端,并具有姓氏的可能性,但是,正如我所说,这可能不是您所追求的,只是使您的代码可以编译并以最小的更改运行的可能性...

更新

如评论中所讨论的,如果我需要实现这种转换,则我更愿意选择

  • 创建一个辅助方法

     public class Client : Person { public static Client GetClientFromPerson(Person p) { if (p == null) { return null; } return new Client { FirstName = p.FirstName }; } } 

这将导致:

Client c = Client.GetClientFromPerson(p);
  • 添加第二个构造函数

     public class Client : Person { public string LastName { get; set; } public Client() { } public Client(Person p) : this() { FirstName = p.FirstName; } } 

这将导致:

Client c = new Client(p);

这将使其他人查看代码变得容易得多,将来也可能进行维护,并且不需要您更改现在拥有的继承关系。

Person不是Client因此您希望编译器如何转换它? 试试这个,你会得到一个null

Client c = p as Client;

换句话说:编译器错误消失了,但是c始终为null

这会引发异常,因为p不是客户端。 p已创建为person 您可以创建一个client object并将其强制转换为它的基类person ,但是这种方式并非如此。

子级可以继承其父类的所有属性,但是父级只能继承公共属性。 这并不意味着您可以直接将父对象分配给它的子对象。

您可以使用asis歌剧来做到这一点

通过使用as运算符,如果变量不为null,则该类可转换为其他类

Person p = new Person();
var conversionResultFromPersonToClient = p as Client;
if(conversionResultFromPersonToClient != null)
   //it means you can cast from person to client

第二个方法是用的就是运营商

Person p = new Person();
Client c = new Client();
if(p is Client)
   //Then you can cast person to client
   c = (Client)p;

暂无
暂无

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

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