在强制转换为基类的对象上调用派生类方法

本文关键字:对象 调用 派生 类方法 基类 转换 | 更新日期: 2023-09-27 18:02:32

我有一个基类Element和一个派生类ViewSheet。当我收集所有的ViewSheet对象时,它们被收集器方法转换为Element。现在我需要在每个对象上调用一个名为ViewSheet.get_Parameter()的方法。该方法只存在于派生类上,因此不能在Element上调用。

我可以从调用Element.GetType()中找出派生类型,但是我如何将该对象强制转换为ViewSheet,然后在其上调用ViewSheet.get_Parameter() ?

由于这种情况经常发生,我需要实现某种泛型方法,可以接受不同的基类+派生类组合。如有任何意见,我将不胜感激。

收集器方法示例:

`ICollection<Element> allElements = 
    new FilteredElementCollector(activeDoc)
    .OfCategory(someCategory)
    .WhereElementIsNotElementType()
    .ToElements();

这总是返回Element的对象集合,因为这是我正在处理的所有对象的基类。我可以在收集期间做Linq cast,但我需要知道,基于我的类别,我将收集特定类型的对象,我现在一开始没有。只有当我真正收集所有Element对象并调用GetType()时,我才知道我正在处理的是什么类型。

在强制转换为基类的对象上调用派生类方法

使用as来强制转换AElement。如果强制转换成功,则PossibleViewSheet不为空,您可以调用get_Parameter()

ViewSheet PossibleViewSheet = AElement as ViewSheet;
if (PossibleViewSheet != null)
{
  PossibleViewSheet.get_Parameter();
}

如果你有许多不同的具体类,你必须定义一个接口

public interface IGetParameter
{
  int get_Parameter();
}

实现所有需要的类的接口,并使用as -操作符的接口,如

IGetParameter PossibleGetParameter = AElement as IGetParameter;
if (PossibleGetParameter != null)
{
  PossibleGetParameter.get_Parameter();
}

第三种方法是使用反射来获取方法的名称,如

try
{
  AElement.GetType().GetMethod("get_Parameter").Invoke(AElement, null);
}
catch(Exception)
{
  //Method is not available
}

如果你的get_Parameter()需要一个或多个参数(get_Parameter(int definition, ...)),添加一个对象数组的参数(如

)
AElement.GetType().GetMethod("get_Parameter").Invoke(AElement, new object[] { definition, ... });

你在试图做你正在做的事情时,违反了所有好的设计和OOP规则。如果你想使用"基类",它应该包含派生类需要实现的所有虚方法。如果没有,说明你的"基类"在层次结构中位置太低。