2012-10-09 19 views
5

Chcę przenieść Business Objects z jednego komputera na inny. Jeśli pomyślę o liczbie około 40 różnych typów obiektów do przeniesienia, użycie wielu kontraktów dla różnych obiektów wydaje się być dość dużym obciążeniem dla zawsze tego samego zadania: "Wyślij obiekt A do komputera B i zapisz obiekt do DB" (obiekty wszystkie mają metodę trwałą).Jak używać zmiennej jako typu

Ponieważ Obiekty mogą mieć wiele różnych rodzajów, chcę tylko, aby użyć metody rodzajowe do:

  1. serializować obiektu BO
  2. przenieść ją do innego komputera
  3. deserializowania go z odpowiedniego typu
  4. wykonać kontrolę spójności
  5. Zapisz db
  6. jest mój problem.

W tej chwili myślę o wysłaniu typu jako informacji eytra. Następnie chcę zrobić coś takiego:

BinaryFormatter aFormatter = new BinaryFormatter(); 
aFormatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple; 
Object.ParseTypeFromString(aObjektType) aObject = aFormatter.Deserialize(stream) as Object.ParseTypeFromString(aObjektType); 

a potem po prostu użyć metody rodzajowe z obiektu bazowego, aby zapisać obiekt do bazy danych, aby zachować klas transferowych tak proste, jak to możliwe.

Czy istnieje możliwość zrobienia czegoś takiego? Czy też idę w zupełnie niewłaściwym kierunku i łatwiej byłoby osiągnąć to zadanie z innym podejściem?

Odpowiedz

5

Jeśli nie znasz typu wyprzedzeniem, to nie może obecnie robić coś w C#, który zależy od rodzaju. BinaryFormatter będzie już być deserializacji go z odpowiedniego typu obiektu, ale zwykle tylko kod może odnosić się do obiektu jako .... object:

object aObject = aFormatter.Deserialize(stream); 

W tym momencie istnieją różne opcje dostępne dla Ciebie:

  • wykorzystanie wspólnego interfejsu/zasady klasy
  • zastosowanie dynamic (interesujących zastosowań dynamic obejmują wywołanie najodpowiedniejszego przeciążenia sposobu i przełączania w sposób ogólny)
  • badanie typu wyraźnie ze is, as lub GetType(), na specjalne obudowy

Jako przykład opcją środkowej:

object aObject = aFormatter.Deserialize(stream); 
GenericMagic((dynamic)aObject); 
OverloadMagic((dynamic)aObject); 

... 

void GenericMagic<T>(T obj) // possibly some constraints here too 
{ 
    T x = ... // now we *have* the type, but as `T`; 
       // of course, you still can't do many exciting 
       // things unless you add constraints 
} 

// the correct one of these will be chosen at runtime... 
void OverloadMagic(Customer cust) {...} 
void OverloadMagic(User user) {...} 
void OverloadMagic(Order order) {...} 

Szczerze mówiąc, jeśli miałem do deserializowania (etc) coś nieznanego zwykle wolę pozostać nietypowy, po prostu używając object, GetType(), a może trochę refleksji - to nadal jest generic, nawet jeśli nie używa generics.

+0

Tak, co jest następujące: Czy mogę wysłać dodatkowy ciąg znaków, który zawiera nazwę typu, a następnie użyć tej informacji o łańcuchu jako typu obiektu? – Offler

+0

@Offler obiekt już zna jego typ, jeśli używasz 'BinaryFormatter'. W przypadku serializerów takich jak 'XmlSerializer', to nie będzie -' Type.GetType (string) 'jest twoją najlepszą opcją, ale musisz przechowywać' .AssemblyQualifiedName', a nie tylko '.FullName' (inaczej wygrałby nie wiem, do jakiego zespołu się zwrócić). Jednak nie można tego uczynić * zmienną *; to po prostu daje 'Type' do użycia w czasie wykonywania; na przykład 'Type type = GetAndParseTheType(); var ser = new XmlSerializer (type); var obj = ser.Deserialize (stream); ' –

+0

Dobra, trochę się pobawię, żeby zobaczyć, jak to działa. Myślałem, że potrzebuję czegoś takiego jak aObjType = aObj.GetTypeFromName ("ThisisMyType"); MethodInfo aMethod = aObjType.GetMethod ("persist"); aMethod.Invoke (aObj, nowy obiekt [0]); – Offler

Powiązane problemy