如何告诉编译器只有在属性存在的情况下才能访问该属性

本文关键字:属性 情况下 访问 存在 编译器 何告诉 | 更新日期: 2023-09-27 18:24:00

我可以使用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子句。

有解决方案吗?

如何告诉编译器只有在属性存在的情况下才能访问该属性

您必须包含对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帮我解决了这个问题。

相关文章: