我可以扩展基类并将基类转换为扩展名

时间:2013-03-11 17:00:37

标签: c#

我写了这段代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Net.Mail;
using System.Net;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Foo m_oFoo = new Foo() { 
            S1 = "N"
        };

        List<Foo> m_List = new List<Foo>();
        m_List.Add(m_oFoo);

        IFoo m_oIFoo = (IFoo)m_List[0];
        m_oIFoo.S2 = "C";

        Response.Write(m_oIFoo.S1);
        Response.Write(m_oIFoo.S2);
    }
}

public class Foo
{
    public string S1 { get; set; }
    public Foo()
    {

    }
}

public class IFoo: Foo
{
    public string S2 { get; set; }
    public IFoo(){}
}

但编译器说“无法在类型'IFoo'上投射'Foo'类型的对象。” 如何在没有使用所有Foo方法声明一个脚轮的情况下将Foo转换为Foo1,因为这是一个例子,Foo有超过100种方法。

感谢您的帮助

6 个答案:

答案 0 :(得分:2)

  

如何将Foo转换为Foo1

你做不到。永远。该对象实际上是Foo对象,而不是IFoo,因此任何演员都不会成功。你需要“转换”对象,这是一个非常不同的事情。您需要根据IFoo实例中提供的数据创建新的Foo对象。实现此目的的一种方法是IFoo中的构造函数接受Foo对象:

public class IFoo: Foo
{
    public string S2 { get; set; }
    public IFoo(){}
    public IFoo(Foo other)
    {
        S1 = other.S1;
    }
}

然后你可以这样做:

IFoo m_oIFoo = new IFoo(m_List[0]);

答案 1 :(得分:0)

您不能将基类强制转换为其派生(扩展)类之一。如果您考虑一般扩展类的过程,这非常直观。扩展类时,扩展类可能会添加基类中不存在的成员,因此当编译器允许转换时,可能会发生灾难性的事情!

答案 2 :(得分:0)

抱歉,没有内置的方法。最好的办法是使用反射来检索两个类中存在的所有属性,并以这种方式设置值,或者可能序列化对象,然后将其反序列化为另一种类型。

两种方式都不完美。

答案 3 :(得分:0)

您不能将基类强制转换为子类,但您可以使用conversion operator执行类似的操作。

public class IFoo: Foo
{
    ...

    public static explicit operator IFoo(Foo foo)  // explicit byte to digit conversion operator
    {
        ...
    }
}

答案 4 :(得分:0)

您无法从基类强制转换为派生类。相反,请尝试编写explicit转换器并使用AutoMapper映射所有属性。

答案 5 :(得分:-1)

首先,请不要在你的课程中首先获得资金,这通常用于接口。其次,你不能“向上”,因为IFoo继承了Foo,而不是相反。

以这种方式思考:IFoo是一个Foo,但不是相反。

但是,您可以将其重写为:

IFoo m_oIFoo = m_List[0] as IFoo; // this might be null now
if (m_oIFoo != null)
{
    m_oIFoo.S2 = "C";

    Response.Write(m_oIFoo.S1);
    Response.Write(m_oIFoo.S2);
}

使用as运算符进行强制转换,但要注意它可以返回null。