Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Hoe het basisobject van een overgeerft object krijgen

Pagina: 1
Acties:

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 23-11 10:53
Hallo,

Ik wil een object oversturen door middel van WCF. Ik wil echter alleen het basisobject doorsturen, niet het overgeerfde object, dit om ervoor te zorgen dat ik zo min mogelijk data overstuur aangezien de overgeerfde vorm veel (nutteloze) data kan bevatten. Als ik het object typecast stuurt hij nog steeds het overgeerfde formaat over, ik ben dus op zoek naar een manier om de basisclass los te krijgen van de overgeerfde data.

Ik heb een classe A waarin een aantal properties zitten, verder heb ik een class B die van A overerft + een aantal properties toevoegt

Een nieuw object A aanmaken met de basisdata van B doe ik liever niet omdat het een groot aantal objecten kunnen zijn en ik niet continue deze opnieuw wil aanmaken...

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class A
{
    public string Name {get;set;}
    public int Age {get;set;}

   public A(string name,int age)
   { 
        Age = age;
        Name = name;
   }
}

public class B : A
{
     public bool IsMale{get;set;}
   public B(string name,int age, bool isMale):base(name,age)
   { 
      IsMale = isMale;
   }
}


Dit werkt allemaal prima, mijn vraag is nu hoe ik de baseclass kan krijgen, zonder de overerving van B eromheen dus.

Hetvolgende heb ik al geprobeert en mag niet (:
C#:
1
2
3
4
public A GetBase()
{
   return base;
}


Hoe kan ik de baseclass los maken van de overgeerfde class?

[ Voor 7% gewijzigd door ThaStealth op 02-01-2013 12:07 ]

Mess with the best, die like the rest


  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 23-11 06:30

Koppensneller

winterrrrrr

Kun je niet zoiets doen?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class A 
{ 
    public string Name {get;set;} 
    public int Age {get;set;} 

   public A(string name,int age) 
   {  
       Age = age; 
       Name = name; 
   } 

   public A(A copy)
   {
      Age = copy.Age;
      Name = copy.Name;
   }
} 

public class B : A 
{ 
     public bool IsMale{get;set;} 
     public B(string name,int age, bool isMale):base(name,age) 
     {  
        IsMale = isMale; 
     } 
}


Dan maak je dus een nieuw basisobject op basis van je gespecialiseerde klasse. Dat object kun je daarna versturen :)

Niet goed gelezen :X

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik zou inderdaad een Copy constructor gebruiken (wat Koppensneller dus suggereert) of gewoon met AutoMapper (is gewoon een NuGet package) een kopietje trekken.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Gewoon werken met wat WCF je al geeft: de IDataContractSurrogate interface.

'Copy constructors' en het gebruik van zaken als Automapper zijn alleen maar onnodige overhead.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
R4gnax schreef op woensdag 02 januari 2013 @ 12:52:
Gewoon werken met wat WCF je al geeft: de IDataContractSurrogate interface.
Oeh, nice! Die kende ik nog niet :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • evolution536
  • Registratie: Maart 2009
  • Laatst online: 05-06-2024

evolution536

besh besh

C#:
1
2
3
4
public A GetBase() 
{ 
   return this as A; 
}


Sorry als ik het verkeerd heb begrepen hoor, maar is dit een oplossing?

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
evolution536 schreef op woensdag 02 januari 2013 @ 22:17:
C#:
1
2
3
4
public A GetBase() 
{ 
   return this as A; 
}


Sorry als ik het verkeerd heb begrepen hoor, maar is dit een oplossing?
Alleen als je ervan houdt om subtiele bugs in je codebase te introduceren. Dit zou je namelijk overal met de hand aan moeten roepen waar WCF serialisatie plaats vindt. Omdat B een subclass is van A en dus assignable is aan variabelen van type A krijg je ook geen compile-time waarschuwing wanneer het fout gaat.

Dat is wachten tot het een keer ergens drie repositories diep, dynamisch via een IoC container geinjecteerd fout gaat. En dan mag je op je gemak een dagje gaan graven ...

Dat is nog afgezien van het feit dat het waarschijnlijk toch niet zou werken. WCF zal het bijhorende data contract ophalen a.d.h.v. een DataContractAttribute wat op zijn beurt intern naar alle waarschijnlijkheid opgehaald wordt m.b.v. obj.GetType().GetCustomAttributes(). Het Type wat je terug krijgt uit GetType het echte, onderliggende run time type en niet het compile time type. Je gaat dan naar alle waarschijnlijkheid dus alsnog het data contract voor B gebruiken en niet dat voor A.

Hier is gewoon maar één goede oplossing voor en dat is het gebruik van data contract surrogates.

[ Voor 6% gewijzigd door R4gnax op 02-01-2013 23:14 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

R4gnax schreef op woensdag 02 januari 2013 @ 23:13:
[...]


Alleen als je ervan houdt om subtiele bugs in je codebase te introduceren.
Ook dan niet, het is nooit een oplossing. Het resultaat van de code is namelijk exact identiek aan de geprobeerde oplossing van de topicstarter:
C#:
1
2
3
4
public A GetBase() 
{ 
   return base; 
}


'as' is gewoon een cast die null mag retourneren als het object niet van het te casten type is/overerft, wat in dit geval natuurlijk nooit het geval is. Je houdt gewoon een reference naar het object, en het is derhalve geen slicing cast zoals je in C++ kent als je cast by value ipv by reference (in welk geval de (eventueel automatisch gegenereerde) copy constructor van A wordt aangeroepen).

[ Voor 3% gewijzigd door .oisyn op 02-01-2013 23:33 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1