0

我写了这段代码:

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 转换为 Foo1 而无需声明具有所有 Foo 方法的施法者,因为这是一个示例,Foo 有 100 多个方法。

谢谢您的帮助

4

6 回答 6

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]);
于 2013-03-11T17:04:38.663 回答
0

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

于 2013-03-11T17:02:26.527 回答
0

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

两种方式都不是完美的。

于 2013-03-11T17:02:51.103 回答
0

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

public class IFoo: Foo
{
    ...

    public static explicit operator IFoo(Foo foo)  // explicit byte to digit conversion operator
    {
        ...
    }
}
于 2013-03-11T17:03:03.483 回答
0

您不能从基类转换为派生类。相反,尝试编写一个explicit转换器并使用AutoMapper来映射所有属性。

于 2013-03-11T17:05:39.380 回答
-1

首先,请避免在您的类中使用大写字母 I,这通常用于接口。其次,您不能“向上”投射,因为 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。

于 2013-03-11T17:04:54.480 回答