2015-07-07 8 views
5

Stworzyliśmy strukturę Id32 i Id64 do przechowywania liczb całkowitych i wartości długich pochodzących z DB, dzięki czemu można je jawnie przetwarzać jako identyfikatory przez konwerter Json (z dedykowanymi niestandardowymi konwerterami).Środowisko wykonawcze niejawnie rzutuje z obiektu

Problemem jest to, że możemy odczytać te dane z Dictionary<string, object> że faktycznie jest DataRow -jak obiekt gdzie string część to nazwa kolumny i object część jest wartością.

Więc przed mieliśmy ten kod, aby odczytać wartość:

int myVal = (int)row["COLUMN"] 

Chcemy ten kod, aby kontynuować pracę także po tych zmianach.

Ale ponieważ row["COLUMN"] jest object (@ czasie kompilacji) niejawny oddanych zawodzi, mimo że w rzeczywistości jest Id32 (@ run-time).

Poniższy oczywiście działa:

int myVal = (Id32)row["COLUMN"] 

Ale czy jest jakiś sposób aby rozwiązać ten bez modyfikowania kod, który odczytuje wartość?

Jest to kod struct:

public struct Id32 
{ 
    public readonly int Value; 

    public Id32(int id) { this.Value = id; } 

    public static implicit operator int(Id32 id) { return id.Value; } 

    public static implicit operator Id32(int id) { return new Id32(id); } 
} 
+0

Zobacz również: http://stackoverflow.com/questions/1611083/will-the-c-sharp-compiler-perform-multiple-imicit-conversions-to-get-from-one –

+0

To pytanie dotyczy konwersji niejawnych , nie rzuca. Chociaż rzutowanie jest zaangażowane (masz "obiekt" i trzeba go przesłać do 'int', być może wewnątrz niejawnej konwersji z' obiektu 'zdefiniowanego w' Id32'). – binki

Odpowiedz

2

Moim zdaniem nie bardzo przyzwoite rozwiązanie, ale działa (mam nadzieję, że są lepsze rozwiązania): jeśli używasz dynamic typ bazowy jest określana na run-time , więc sprawdzenie typu z niejawnym rzutowaniem zadziała.

Kod Użyłem:

dynamic o = new Id32(1); 
// dynamic o = row["COLUMN"]; in your case 

int myVal = (int)o; 

Jeżeli zmienisz dynamic do object będzie mieć swoją aktualną sytuację, która nie zawodzi.

+1

To naprawdę interesujące. Ale tak naprawdę nie wiem, czy można zadeklarować 'Dictionary ' ... Spróbuję. – Teejay

+0

Nie, ale jest już konwertowane w tym czasie (jeśli zrobisz to przed dodaniem do słownika), więc nie ma znaczenia. –

+0

Niestety, w ten sposób, musimy zmodyfikować kod, aby odczytać wartość mimo to. – Teejay

3

Myślę, że to nie jest możliwe z ograniczeniem, aby nie modyfikować swojego kodu pobierającegoint myVal = (int)row["COLUMN"].

Należy dodać niejawne rzutowanie do object (do int), którego nie można wykonać. Istnieje wiele sposobów na uproszczenie własnej obsady, ale każdy, kogo mogę wymyślić, może wymagać zmiany tego wiersza w następujący sposób: here.

Nawet jeśli tego nie zmienisz, to chyba będziesz musiał dokonać ponownej kompilacji - więc jeśli przekompilujesz to, dlaczego nie zmienić? Jest kilka narzędzi do refaktoryzacji, które powinny sprawić, że nawet tysiące linii będzie całkiem łatwe.

+0

Dziękujemy za Twój wkład. – Teejay

Powiązane problemy