Приведение объекта в базовый класс, возвращение расширенного объекта? - PullRequest
0 голосов
/ 13 апреля 2010

Мой код:

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 ]

1 голос
/ 13 апреля 2010

Вы определенно не можете превратить класс в один из его базовых классов путем приведения. В зависимости от типа сериализации, которую вы используете, вы можете указать сериализатору предположить, что класс имеет базовый тип, что ограничит сериализацию членами базового типа.

1 голос
/ 13 апреля 2010

Ничего общего с Silverlight.

Вот что делает кастинг - вы по-прежнему возвращаете ссылку на c, что равно a Base.Contact.

Вы не можете позвонить ContactType или Person на cb (если вы не настроены, что вы не должны).

В чем проблема?

0 голосов
/ 14 апреля 2010

Я читаю ответы и до сих пор не понимаю проблемы! В чем проблема с приведенным выше кодом?


Кроме того, из комментариев я понимаю, что вам нужно только сериализовать базовый класс. Я думаю, что нет проблем, для начала. Посмотрите на пример -

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
0 голосов
/ 14 апреля 2010

Добавьте конструктор копирования в базовый класс (например, public Contact(Contact other)), а затем вы можете сделать это:

Contact c = new Contact();
Base.Contact cb = new Base.Contact(c);
...