Хорошо, когда вы знаете конкретный класс, который возвращает метод. Но что делать, если метод, к примеру getApplicationContext
, возвращает абстрактный тип?
Пока что единственным вариантом вижу получения имени класса у полученного объекта, потом на основании этого имени нахожу соответствующий C# класс.
Если брать всё тот же метод context.getApplicationContext()
, то вот этим методом можно инстанциировать соответствующий класс:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public Object ObjectCallAutoResolve(string name, params object[] args) { IntPtr value = ObjectCall(name, GetClass().Replace('.', '/'), args); if (value == IntPtr.Zero) return null; var clsname = new Object(value).GetClass().GetName(); var t = GetCsharpClass(clsname); if (t == null) return null; ConstructorInfo c = t.GetConstructor(new[] { value.GetType() }); if (c != null) { return (Object) c.Invoke(new object[] { value }); } else { DebugPrint("Can't instantiate class, probably no constructor with IntPtr arg"); } return null; } |
Но да, приходится создавать пару лишних вспомогательный объектов, чтоб через них вызвать getClass().getName()
, потом найти C# имя класса и инстанциировать его.
В итоге, если вызвать этот метод для Activity
, то создастся конкретный класс Application
.
Может есть способ сделать этот попроще, но я пока его не знаю.