/ / Określanie, jak obiekt jest rzutowany w metodzie za pomocą Reflection - c #, odbicie, rzutowanie, niejawne, przypisywanie

Określanie, w jaki sposób obiekt jest rzutowany wewnątrz metody z odbiciem - c #, odbicie, rzutowanie, niejawne, przypisanie

Jak można zastosować Odbicie, aby określić sposób, w jaki obiekt jest rzucany z wnętrza metody?

Przykład:

Biorąc pod uwagę ten typ, który można niejawnie rzutować i przypisywać jako int, float lub string:

public class VersatileType {

public int intVal = 10;
public float floatVal = 1.5f;
public string stringVal = "words";

// implicit convertions

// ints
public static implicit operator int(VersatileType vt) {
return vt.intVal;
}

public static implicit operator VersatileType(int val) {
VersatileType vt = new VersatileType();
vt.intVal = val;
return vt;
}

// floats
public static implicit operator float(VersatileType vt) {
return vt.floatVal;
}

public static implicit operator VersatileType(float val) {
VersatileType vt = new VersatileType();
vt.floatVal = val;
return vt;
}

// strings
public static implicit operator string(VersatileType vt) {
return vt.stringVal;
}

public static implicit operator VersatileType(string val) {
VersatileType vt = new VersatileType();
vt.stringVal = val;
return vt;
}
}

I podana metoda, która wykonuje pewne niejawne rzutowanie i przypisywanie:

public VersatileType obj;

public void CastAndAssignObj() {

obj = 0;
string text = obj;
}

Czy istnieje sposób użycia Reflection (lub dowolnego innego procesu) do ustalenia, w jaki sposób „obj” zostało obsadzone / przypisane od wewnątrz CastAndassignObj()?

Chciałbym skończyć z kolekcją zawierającą Typy int i string dla powyższego przykładu.

Wielkie dzięki-

Odpowiedzi:

0 dla odpowiedzi № 1

Odbicie nie przyniesie ci tutaj żadnego pożytku, ponieważ zawsze da radę VersatileType i który ma 3 właściwości typu string, int i float odbicie nie powie ci, który jest używany. Myślę, że najprostszym sposobem na zrobienie tego, co chcesz, jest albo dodać flagę (isInt, isFloat, isString) lub przestać inicjować te wartości, abyś mógł powiedzieć

   if (myVersatileType.StringVal != null)
// guess we"re a string

Nie można używać refleksji, ponieważ nie tworzy ona różnych typów. Istnieje tylko jeden typ, który ma trzy wartości i używana jest tylko jedna z nich.