Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

2 objects, exactly the same (except namespace) c#

I'm using a 3rd party's set of webservices, and I've hit a small snag. Before I manually make a method copying each property from the source to the destination, I thought I'd ask here for a better solution.

I've got 2 objects, one of type Customer.CustomerParty and one of type Appointment.CustomerParty. The CustomerParty objects are actually property and sub-oject exactly the same. But I can't cast from 1 to the other.

So, I need to find a certain person from the webservice. I can do that by calling Customer.FindCustomer(customerID) and it returns a Customer.CustomerParty object.

I need to take that person that I found and then use them a few lines down in a "CreateAppointment" request. Appointment.CreateAppointment takes an appointment object, and the appointment object contains a CustomerParty object.

However, the CustomerParty object it wants is really Appointment.CustomerParty. I've got a Customer.CustomerParty.

See what I mean? Any suggestions?

like image 258
Matt Avatar asked Sep 24 '10 15:09

Matt


People also ask

Can you have 2 namespaces in C#?

In c#, we can define and access multiple namespaces in our application with using keyword. To access the custom namespace classes, we need to import the custom namespace with using keyword and need to create an instance for that classes in our application.

How do I copy one model to another in C#?

In general, when we try to copy one object to another object, both the objects will share the same memory address. Normally, we use assignment operator, = , to copy the reference, not the object except when there is value type field.

What is namespace C#?

The namespace keyword is used to declare a scope that contains a set of related objects. You can use a namespace to organize code elements and to create globally unique types.

Should using directives be inside or outside the namespace?

The using directive can appear: At the beginning of a source code file, before any namespace or type declarations.


3 Answers

Why don't you use AutoMapper? Then you can do:

TheirCustomerPartyClass source = WebService.ItsPartyTime();

YourCustomerPartyClass converted = 
    Mapper.Map<TheirCustomerPartyClass, YourCustomerPartyClass>(source);

TheirCustomerPartyClass original = 
    Mapper.Map<YourCustomerPartyClass, TheirCustomerPartyClass>(converted);

As long as the properties are identical, you can create a really simple map like this:

Mapper.CreateMap<TheirCustomerPartyClass, YourCustomerPartyClass>();
Mapper.CreateMap<YourCustomerPartyClass, TheirCustomerPartyClass>();
like image 51
djdd87 Avatar answered Sep 21 '22 01:09

djdd87


This scenario is common when writing domain patterns. You essentially need to write a domain translator between the two objects. You can do this several ways, but I recommend having an overridden constructor (or a static method) in the target type that takes the service type and performs the mapping. Since they are two CLR types, you cannot directly cast from one to the other. You need to copy member-by-member.

public class ClientType
{
    public string FieldOne { get; set; }
    public string FieldTwo { get; set; }

    public ClientType()
    {
    }

    public ClientType( ServiceType serviceType )
    {
        this.FieldOne = serviceType.FieldOne;
        this.FieldTwo = serviceType.FieldTwo;
    }
}

Or

public static class DomainTranslator
{
    public static ServiceType Translate( ClientType type )
    {
        return new ServiceType { FieldOne = type.FieldOne, FieldTwo = type.FieldTwo };
    }
}
like image 37
Jordan Parmer Avatar answered Sep 21 '22 01:09

Jordan Parmer


I'm using a 3rd party's set of webservices...

Assuming you can't modify the classes, I'm not aware of any way you can change the casting behavior. At least, no way that isn't far, far more complicated than just writing a CustomerToAppointmentPartyTranslator() mapping function... :)

Assuming you're on a recent version of C# (3.5, I believe?), this might be a good candidate for an extension method.

like image 1
Dan J Avatar answered Sep 24 '22 01:09

Dan J