2015-11-23 4 views
0

Я пытаюсь выяснить, содержит ли AppDelegate определенное свойство/способ. Для этого я нашел Check if a property exist in a class и How to check whether an object has certain method/property?, но AppDelegate кажется другим.Проверьте, существует ли метод/свойство в AppDelegate

Ниже не компилируется

if(AppDelegate.HasMethod("SomeMethod")) 

потому

AppDelegate не содержит дефиниция для HasMethod.

Я также пробовал другие варианты, но мне не удалось успешно проверить, существует ли метод/свойство или нет. Более того, respondsToSelector здесь не применим. GetType() также не доступен для AppDelegate.

Каков правильный способ проверки наличия свойства/метода в AppDelegate?

Edit:

Кажется, что мне нужен экземпляр AppDelegate для работы с ним. Вопрос для меня - как я могу заверить, что этот экземпляр доступен? Например. путем выброса исключения, если он не реализован?

Вот что вы можете сделать:

AppDelegate

public static new AppDelegate Self { get; private set; } 

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions) 
{ 
    AppDelegate.Self = this; 

    return true; 
} 

[Export ("YourMethod:")] 
public void YourMethod (bool setVisible){ 
    // do something 
} 

Некоторые класса

if(AppDelegate.Self.RespondsToSelector(new Selector("YourMethod:"))) 
{ 
    AppDelegate.Self.YourMethod (true); 
} 

Вам не нужно использовать respondsToSelector, вы можете использовать другие C# /. NET методы (HasMethod, HasProperty из связанных потоков), если у вас есть экземпляр AppDelegate. Вопрос для меня в том, как я могу заверить, что Self реализован в AppDelegate?

Да, компилятор проверяет это для меня, но я хочу выполнить метод только в том случае, если он реализован. Это не должно быть необходимостью его реализации. Он также должен работать без YourMethod.

+0

Является ли решение @ try/catch подходящим? Это немного грубый метод, но он должен работать. – mylogon

+0

@mylogon: Это было бы возможно, но будет ли он компилироваться, если я получу доступ к свойству, которое может не существовать? – testing

ответ

1

И наконец, я нашел решение. Прежде всего, необходимо два метода расширения:

public static class GeneralExtensions 
{ 
    public static bool HasProperty(this object obj, string propertyName) 
    { 
     return obj.GetType().GetProperty(propertyName) != null; 
    } 

    public static bool HasMethod(this object objectToCheck, string methodName) 
    { 
     var type = objectToCheck.GetType(); 
     return type.GetMethod(methodName) != null; 
    } 
} 

Для проверки метода используется

if (UIApplication.SharedApplication.Delegate.HasMethod("YourMethod")){ 
    // do something 
} 

Чтобы проверить свойство используется

if (UIApplication.SharedApplication.Delegate.HasProperty("Instance")) 
    // do something 
} 

Идея пришла из this thread.

Но это еще не конец истории. Мой окончательный подход можно найти here.

0

Обновленный ответ

Я знаю, что это все еще Obj-C, но вы должны быть в состоянии легко получить C# эквивалент.

#import "AppDelegate.h" 

SEL selector = NSSelectorFromString(@"possibleMethod"); 
AppDelegate * appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate; 
if([appDelegate respondsToSelector:selector]){ 
    [appDelegate selector]; 
} 

Успехов


Во-первых,

#import "AppDelegate.h" 

Вы можете попробовать метод ниже с помощью @try блок попытаться проверить селектор.

BOOL methodExists = YES; 
    SEL yourVariable = NSSelectorFromString(@"possibleMethod"); 
    AppDelegate * ad = [[AppDelegate alloc]init]; 

    @try { 
     [ad performSelector:yourVariable withObject:nil afterDelay:0.0]; 
    } 
    @catch (NSException *exception) { 
     methodExists = NO; 
    } 
    @finally { 

     if (methodExists) { 
      //Call method from selector 
     } 

    } 
+0

Спасибо за ваше дополнение. Я попытался перевести код на C#. Настоящим я заметил, что мне нужен фактический экземпляр «AppDelegate», где вы можете отправить сообщение 'performSelector'. Я редактировал свой вопрос, чтобы показать вам, как я получаю доступ к экземпляру. Но моя основная проблема все еще присутствует: как я могу заверить, что свойство 'Self' реализовано в' AppDelegate'? – testing

+0

Извинения. По какой-то причине я просто заметил «C#». Я не так хорошо знаком с этим. – mylogon

+0

Нет проблем. Я также рад, если вы можете предоставить решения в Objective-C/Swift, потому что я могу переводить их большую часть времени. Можете ли вы в любое время получить доступ к «AppDelegate» в Objective-C? Или как вы получаете экземпляр этого? – testing

Смежные вопросы