我的代码:
public class Contact
{
public string id{ get; set; }
public string contact_type_id { get; set; }
public string value{ get; set; }
public string person_id { get; set; }
public Contact()
{
}
}
public class Contact:Base.Contact
{
public ContactType ContactType { get; set; }
public Person Person {get; set;}
public Contact()
{
ContactType = new ContactType();
Person = new Person();
}
}
和
Contact c = new Contact();
Base.Contact cb = (Base.Contact)c;
问题:
The **cb** is set to **Contac** and not to **Base.Contact**.
Have any trick to do that????
答案 0 :(得分:1)
与Silverlight无关。
这就是投射的作用 - 您仍然会返回对c
的引用,其中 是Base.Contact
。
您无法在ContactType
上致电Person
或cb
(除非您是上传,否则不应该)。
有什么问题?
答案 1 :(得分:1)
你绝对不能通过强制转换将一个类转换为其基类之一。根据您正在使用的序列化类型,您可以告诉序列化程序假设该类是基类型,这会将序列化限制为基类型的成员。
答案 2 :(得分:0)
将复制构造函数添加到基类(例如public Contact(Contact other)
)中,然后您可以执行此操作:
Contact c = new Contact();
Base.Contact cb = new Base.Contact(c);
答案 3 :(得分:0)
我读了答案但仍然不明白这个问题!
上面的代码有什么问题?
此外,从评论中,我了解到您只需要序列化基类。我认为首先没有问题。看一下例子 -
class A
{
public int a = -1;
};
class B : A
{
public int b = 0;
};
class Program
{
static void Main(string[] args)
{
A aobj = new B();
aobj.a = 100; // <--- your aobj obviously cannot access B's members.
Console.In.ReadLine();
}
}
现在,如果你必须使你的序列化功能虚拟,那么是的,有问题。那么这可能会有所帮助 -
abstract class Ia
{
public abstract void Serialize();
}
class A : Ia
{
public int a = -1;
sealed public override void Serialize() {
Console.Out.WriteLine("In A serialize");
}
};
class B : A
{
public int b = 0;
/*
* Error here -
public override void Serialize()
{
Console.Out.WriteLine("In B serialize");
}
*/
//this is ok. This can only be invoked by B's objects.
public new void Serialize()
{
Console.Out.WriteLine("In B serialize");
}
};
class Program
{
static void Main(string[] args)
{
A aobj = new B();
aobj.Serialize();
Console.In.ReadLine();
}
}
//Output: In A serialize