Определение того, как объект приводится внутри метода с помощью Reflection

Как можно использовать 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 для приведенного выше примера.

Большое спасибо-


person user3154397    schedule 02.01.2014    source источник


Ответы (1)


Отражение здесь не принесет вам пользы, потому что оно всегда будет давать VersatileType, а у него есть 3 свойства типа string, int и float. Отражение не скажет вам, какое из них используется. Я думаю, что самый простой способ сделать то, что вы хотите, — это либо добавить флаг (isInt, isFloat, isString), либо прекратить инициализацию этих значений, чтобы вы могли сказать

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

Вы не можете использовать отражение, потому что оно не создает разные типы. Существует только один тип, который имеет три значения, и используется только одно из них.

person evanmcdonnal    schedule 02.01.2014
comment
К сожалению, мне нужно сделать это определение без запуска кода. Звучит безумно, но мне нужно определить способ использования obj, чтобы я мог использовать информацию как часть инструмента редактора Unity в отдельной среде выполнения, чем исполняемый файл, который в конечном итоге запустит приведенный выше код. Я надеюсь, что это имеет какой-то смысл. - person user3154397; 02.01.2014