Тема: Рефлексия
Показать сообщение отдельно
Старый 12.10.2011, 14:29   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Рефлексия

Воу... Это будет медленно же, если везде заменить это дело таким образом и вызывать в динамике.
Думаю можно было бы реализовать что-то более шустрое, хз как но вот пример как бы я реализовал, если бы компилил под разные платформы.
#define JAVA

namespace Platform {
    public class String {
        delegate string MethodValueOf(float number);

        private static MethodValueOf valueOf;
        public static MethodValueOf ValueOf {
            get {
                if (valueOf == null) {
                    #if JAVA
                        valueOf = delegate(float number) {
                            var javaObj = new AndroidJavaObject("java.lang.String");
                            return javaObj.CallStatic<System.String>("valueOf", number);
                        };
                    #elif CSHARP
                        valueOf = delegate(float number) {
                            return number.ToString();
                        };
                    #endif
                }
                return valueOf;
            }
        }
    }
}
И использовать так:
var valueString = Platform.String.ValueOf(10.0f);
Получается singleton delegate, при этом который будет инициализироваться при первом вызове. Можно конечно это дело обернуть в убер функцию "Initialize", и объявлять все делегаты при включении приложения если так будет удобнее.
Тут используется define чтобы определить платформу, в Unity есть даже для этого уже стандартные дефайны.
По мне так удобно в юзабилити, хотя зависит от тебя. Тут ещё нужно подумать над разными типами данных, т.к. delegate'ы нельзя overload'ить. Но в пользовании у тебя будет одна функция, на разные платформы. Думаю это очень сократит время в разработки игры сразу с мультиплатформенным кодом. Но, это требует создания таких вот делегатов для этих самых функций..

Готовых не видел, и думаю будет весьма сложно это как-то автоматизировать, т.к. методы все разные, по разному используются..

UPD:
Можно ещё кешировать AndroidJavaObject, т.к. он используется для доступа к статическим функциям. Для этого можно сделать статичный менеджер с хешь таблицей для доступа к объекту по имени, будет типо такого: ObjectManager.CallStatic("string", "valueOf", number);
Заместо двух строк. При этом прописать в аттрибутах самого Accessor'а все нужные данные, тип объекта, путь к классу. Получается что менеджер кеширует это дело при включении (прбежиться по акксессорам, и создаст яваобъекты), далее в теле будет проще это вызывать.
Хотя имхо, это не улучшит сильно ситуацию, единственное что это кеширует яваобъект, в остальном лишь ухудшит.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (12.10.2011)