2015-11-23 3 views
0

Я могу использовать HasProperty, чтобы проверить, существует ли свойство. Только если свойство существует, метод должен быть выполнен.Как сообщить компилятору, что свойство доступно только в том случае, если оно существует?

Как компилятор может успешно скомпилировать, даже если свойство не существует? Например.

if (UIApplication.SharedApplication.Delegate.HasProperty("Instance")) 
{ 
    AppDelegate customAppDelegate = UIApplication.SharedApplication.Delegate as AppDelegate; 
    customAppDelegate.Instance.SomeMethod(true); // can't be compiled because Instance doesn't exist 
} 

Дело в том, что во-первых, я проверяю, существует ли свойство. Если да, я выполняю свой метод. Поэтому обычно код никогда не выполняется (кроме свойства существует), но компилятор не может отличить это. Он проверяет только, существует ли свойство и не учитывает предложение if.

Есть ли решение для этого?

+3

Используйте отражение, чтобы выполнить метод или применить его к 'dynamic'. – DavidG

+0

Я не могу найти такие методы, как 'GetMethod()'. Я думаю, что они недоступны в моей среде выполнения. – testing

+0

Затем переведите его в 'dynamic'. – DavidG

ответ

0

Вы должны указать ссылку на Microsoft.CSharp, чтобы получить эту работу, и вам нужно using System.Reflection;. Это мое решение:

if(UIApplication.SharedApplication.Delegate.HasMethod("SomeMethod")) 
{ 
    MethodInfo someMethodInfo = UIApplication.SharedApplication.Delegate.GetType().GetMethod("SomeMethod"); 
    // calling SomeMethod with true as parameter on AppDelegate 
    someMethodInfo.Invoke(UIApplication.SharedApplication.Delegate, new object[] { true }); 
} 

Вот код позади HasMethod:

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

Благодаря DavidG за помощь мне с этим.

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