И снова рефлексия :) (Доступ к полю через строку)

Общие вопросы о Unity3D

И снова рефлексия :) (Доступ к полю через строку)

Сообщение 1max1 01 дек 2018, 01:24

Синтаксис:
Используется csharp
// Есть 2 класса, один обычный, другой статический:
class Class1
{
    public int value;
}

static class Class2
{
    public static Class1 c1 = new Class1();
}

// Хочу сделать метод который будет возвращать значение переменной Class2.c1.value, выглядит сигнатура примерно так:
public static object GetVariableValueOfStaticClass(string variablePath) { }
// Или так:
public static T GetVariableValueOfStaticClass<T>(string variablePath) { }

// Применяется так:
int value = (int)GetVariableValueOfStaticClass("Class2.c1.value");

// Осталось только написать тело метода)
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: И снова рефлексия :) (Доступ к полю через строку)

Сообщение Anonymyx 01 дек 2018, 05:20

Вы в данном случае возвращаете переменную не статик класса.
Синтаксис:
Используется csharp
 int value = (int) typeof(Class1).GetField("value").GetValue(Class2.c1);

Статик класс всего лишь хранит экземпляр обычного класса, из которого и достается переменная.
Если переменная достается из static класса, то в метод GetValue() просто передается null.
Так что ваш метод должен иметь еще 2 аргумента типа Type и object:
Синтаксис:
Используется csharp
 
  public static T GetVariableValue<T>(string name, Type type, object obj)  => (T)type.GetField(name).GetValue(obj);
...
  int value = GetVariableValue<int>("value", typeof(Class1), Class2.cl1);
  int value = GetVariableValue<int>("value", typeof(Class2), null); //достаем публичную статическую переменную типа int из Class2.


 


А смысл данного метода в общем, если все это делается и так за 1 строчку - не совсем ясен.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: И снова рефлексия :) (Доступ к полю через строку)

Сообщение 1max1 01 дек 2018, 14:00

Эта костылизация мне нужна для того чтобы получать доступ к полю через строку, напрямую из кода обратится нельзя, и вот почему - у меня есть скрипт, который создает всплывающие подсказки (Обычный Image + Text), в нем есть поле с текстом и в это поле я хотел бы передавать параметры.

Синтаксис:
Используется csharp
static class Player
{
    public static float money;
}
 

Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: И снова рефлексия :) (Доступ к полю через строку)

Сообщение Anonymyx 01 дек 2018, 18:20

Сделать свой класс для астероида с описанием и с методом GetDescryption() который возвращает это описание, если нужно вставляя значения переменных. При наведении передавать возвращаемую этим методом строку в универсальный класс Tooltip.Show(). Использовать рефлексию для подобных задач все ровно что забивать гвоздь трехтонной кувалдой.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: И снова рефлексия :) (Доступ к полю через строку)

Сообщение 1max1 01 дек 2018, 19:35

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

Можно конечно, но хотелось бы всё сделать универсально и независимо. Рефлексия штука тяжелая, не спорю, но мне ее всего 1 раз в пятилетку юзануть нужно.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: И снова рефлексия :) (Доступ к полю через строку)

Сообщение Tolking 01 дек 2018, 22:26

Именно для этого созданы интерфейсы...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: И снова рефлексия :) (Доступ к полю через строку)

Сообщение lawson 02 дек 2018, 01:02

Tolking писал(а):Именно для этого созданы интерфейсы...

да хспади зачем эти интерфейсы!? Anonymyx правильный вариант подсказал - общий метод, который для каждого объекта вернет необходимые свойства.
Скрытый текст:
Только Descryption пишется Description
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20

Re: И снова рефлексия :) (Доступ к полю через строку)

Сообщение Tolking 02 дек 2018, 12:53

Интерфейс нужен чтобы не перебирать все возможные виды компонент у которых есть описание, а сразу получить интерфейс и получить описание...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: И снова рефлексия :) (Доступ к полю через строку)

Сообщение Ziza 09 дек 2018, 02:12

Как-то так
Синтаксис:
Используется csharp
public static object GetVariableValueOfStaticClass(string variablePath)
{
    if (String.IsNullOrEmpty(variablePath))
        return null;
   
    var parts = variablePath.Split('.');
    var lenght = parts.Length;
   
    var type = Type.GetType(parts[0]);
    if (type == null || lenght == 1)
        return null;
   
    object value = null;
    BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
        | BindingFlags.Static;
   
    for (var i = 1; i < lenght; ++i)
    {
        var info = type.GetField(parts[i], flags);
       
        if (info == null)
            break;
       
        value = info.GetValue(value);
        type = value.GetType();
    }

    return value;
}
Аватара пользователя
Ziza
UNIт
 
Сообщения: 81
Зарегистрирован: 02 ноя 2018, 23:07

Re: И снова рефлексия :) (Доступ к полю через строку)

Сообщение 1max1 09 дек 2018, 10:23

Спасибо, примерно так я и решил, только у тебя попроще будет)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: И снова рефлексия :) (Доступ к полю через строку)

Сообщение Anonymyx 09 дек 2018, 16:03

Синтаксис:
Используется csharp
("Class2.c1.value");

Ой....я неправильно понял вопрос.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14