/ / Визначення того, як об’єкт потрапляє всередину методу за допомогою Reflection - c #, відбиття, лиття, неявний, призначити

Визначення того, як об'єкт реалізується всередині методу з Reflection - c #, reflection, casting, implicit, assign

Як можна використовувати 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

Ви не можете використовувати відображення, оскільки воно не створює різних типів. Існує лише один тип, який має три значення, і використовується лише одне з них.