Як можна використовувати Reflection для визначення способів відкидання об’єкта зсередини методу?
Приклад:
Враховуючи цей тип, який можна неявно передавати і призначати як int, float або 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;
}
}
І даний метод, який виконує неявне кастинг і призначення:
public VersatileType obj;
public void CastAndAssignObj() {
obj = 0;
string text = obj;
}
Чи є спосіб використовувати Reflection (або будь-який інший процес), щоб визначити, як "obj" був доданий / призначений зсередини CastAndassignObj()
?
Я хотів би закінчити колекцію, що містить типи int
і string
для наведеного прикладу.
Дуже дякую-
Відповіді:
0 для відповіді № 1Роздуми не принесуть вам тут жодної користі, оскільки вони завжди дадуть результат VersatileType
і що має 3 властивості типу string
, int
і float
відображення не скаже вам, який саме використовується. Я думаю, найпростіший спосіб зробити те, що ви хочете, - це додати прапор (isInt, isFloat, isString) або припинити ініціалізацію цих значень, щоб ви могли сказати
if (myVersatileType.StringVal != null)
// guess we"re a string
Ви не можете використовувати відображення, оскільки воно не створює різних типів. Існує лише один тип, який має три значення, і використовується лише одне з них.