if (this.Page is ArticlePage|| this.Page is ArticleListPage)
{
//Do something fantastic
}
上面的代码有效,但考虑到我可能想要比较this.Page
的许多不同的类,我想将这些类存储在列表中,然后执行{{1在列表上。
我将如何实现这一目标?我会以某种方式使用.Contains()
吗?我可以存储GetType()
个对象的列表,然后以某种方式比较这些类型吗?
注意:您可以假设我将所有类别Page
与this.Page
进行比较。
答案 0 :(得分:4)
此代码可以完成这项工作:
HashSet<Type> knownTypes = new HashSet<Type>()
{
typeof(ArticlePage),
typeof(ArticleListPage),
// ... etc.
};
if (knownTypes.Contains(this.Page.GetType())
{
//Do something fantastic
}
编辑:正如Chris指出的那样,您可能需要考虑类型继承来完全模仿is
运算符的行为。这有点慢,但对某些目的更有用:
Type[] knownTypes = new Type[]
{
typeof(ArticlePage),
typeof(ArticleListPage),
// ... etc.
};
var pageType = this.Page.GetType();
if (knownTypes.Any(x => x.IsAssignableFrom(pageType)))
{
//Do something fantastic
}
答案 1 :(得分:3)
很难评论您的确切用法,但是(相对)简单的方法来执行此操作并为您的支票添加更多的整洁(尤其是如果您在多个位置执行相同的检查)是要定义一个接口,让相关的页面实现该接口,然后对其进行检查。
空接口:
public interface IDoSomethingFantastic
{
}
例如,您的两个页面定义可能如下所示:
public partial class ArticlePage : System.Web.UI.Page, IDoSomethingFantastic
{
}
public partial class ArticleListPage : System.Web.UI.Page, IDoSomethingFantastic
{
}
然后你的支票基本上是:
if (this.Page is IDoSomethingFantastic)
{
//Do something fantastic
}
这样做的好处是无需集中存储“精彩”页面列表;相反,您只需在页面类声明中定义它,就可以轻松添加/删除“精彩”页面。
此外,您可以将“奇妙”行为移至界面/页面:
public interface IDoSomethingFantastic
{
void SomethingFantastic();
}
然后在您的支票代码中:
if (this.Page is IDoSomethingFantastic)
{
((IDoSomethingFantastic)this.Page).SomethingFantastic();
}
通过这种方式,可以在其他地方处理奇妙的实现,而不是重复。或者您可以将检查和操作完全移到单独的处理类中:
if (FantasticHandler.IsPageFantastic(this.Page))
FantasticHandler.DoSomethingFantastic(this.Page);
答案 2 :(得分:2)
虽然您应该重新考虑使用此类代码(因为它似乎忘记了多态),您可以使用Reflection来检查它:
List<Type> types = new List<Type>()
{
typeof(ArticlePage),
typeof(ArticleListPage)
};
types.Any(type => type.IsAssignableFrom(@object.GetType()));
IsAssignableFrom
不仅适用于特定类,也适用于所有子类,非常类似is
运算符。