我写了这段代码:
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种方法。
感谢您的帮助
答案 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。