检查对象是否与给定列表中的任何类型匹配的替代方法

时间:2013-12-02 16:56:41

标签: c# list class inheritance types

if (this.Page is ArticlePage|| this.Page is ArticleListPage)
{
   //Do something fantastic
}

上面的代码有效,但考虑到我可能想要比较this.Page的许多不同的类,我想将这些类存储在列表中,然后执行{{1在列表上。

我将如何实现这一目标?我会以某种方式使用.Contains()吗?我可以存储GetType()个对象的列表,然后以某种方式比较这些类型吗?

注意:您可以假设我将所有类别Pagethis.Page进行比较。

3 个答案:

答案 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运算符。