将对象转换为基类,返回扩展对象?

时间:2010-04-13 19:12:27

标签: c# silverlight casting extends

我的代码:

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????

4 个答案:

答案 0 :(得分:1)

与Silverlight无关。

这就是投射的作用 - 您仍然会返回对c的引用,其中 Base.Contact

您无法在ContactType上致电Personcb(除非您是上传,否则不应该)。

有什么问题?

答案 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