首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >传递基类列表并获取具体类

传递基类列表并获取具体类
EN

Stack Overflow用户
提问于 2012-09-12 05:50:52
回答 5查看 1.1K关注 0票数 0

我有两个从基类派生的具体类。与混凝土classB相比,混凝土classA具有十个额外的属性。我有一个方法,其中一个参数是基类的列表,比如:List<baseClass>。在方法内部,我必须遍历列表,并强制转换为适当的具体类并访问属性。请让我知道如何实现这一点。有没有好的设计模式可以做到这一点?

EN

回答 5

Stack Overflow用户

发布于 2012-09-12 05:53:56

c#有一个可以查看的GetType方法。

您还可以使用is操作符

代码语言:javascript
运行
复制
if (baseClass is derivedClass)
{
    // do what you will with derived class.
}

一般来说,你首先要做的是一个糟糕的设计模式。当您遍历基类,然后强制转换为派生类时,多态的全部意义就消失了。

也许你可以在你的基类中创建一个方法,它可以做你需要做的各种操作。

票数 3
EN

Stack Overflow用户

发布于 2012-09-12 05:54:58

这是基本的方法:

代码语言:javascript
运行
复制
foreach(baseClass x in theList)
{
   if (x is classA)
   {
       classA a = (classA) x;
       ...
   }
   else if (x is classB)
   {
       classB b = (classA) x;
       ...    
   }
}

当您需要拆分多个类型时,它不会变得更简单。您可以尝试使用接口或不同的继承模型来避免整个事情。在没有看到更多细节的情况下,不可能准确地说出。

票数 2
EN

Stack Overflow用户

发布于 2012-09-12 17:40:48

我猜C#的dynamic类型可以成为你的朋友。

代码语言:javascript
运行
复制
class BaseClass {}

class ConcreteClass1 : BaseClass
{
    void Display1 () {}
}

class ConcreteClass2 : BaseClass
{
    void Display2 () {}
}

void Enumerate (List<BaseClass> baseItems)
{
    foreach (BaseClass baseItem in baseItems)
    {
        ConcreteAccessor ((dynamic)baseItem);
    }
}

void ConcreteAccessor (ConcreteClass1 concreteItem1)
{
    concreteItem1.Display1 ();
}

void ConcreteAccessor (ConcreteClass2 concreteItem2)
{
    concreteItem2.Display2 ();
}    

这里的关键是您有不同的重载,每个具体类一个重载,并使用dynamic无缝地调用其中一个重载。优点在于重载在运行时得到解决,使您的代码看起来很干净。

因为它是运行时类型解析,所以不执行编译时验证。假设您缺少某个具体类型的重载,并且运行时将baseItem解析为该特定的具体类型。然后它会导致运行时错误--崩溃--因为没有重载。

另一个问题是dynamic在幕后使用反射。正如你所知道的,反射会减慢你的应用程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12378450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档