如何告诉编译器只有在属性存在的情况下才能访问该属性
本文关键字:属性 情况下 访问 存在 编译器 何告诉 | 更新日期: 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帮我解决了这个问题。