簡體   English   中英

在強制轉換為基類的對象上調用派生類方法

[英]calling a derived class method on a object cast to base class

我有一個基類Element和一個派生類ViewSheet 當我收集我所有的ViewSheet對象時,它們將由collector方法ViewSheetElement 現在,我需要在每個稱為ViewSheet.get_Parameter()對象上調用一個方法。 該方法僅存在於派生類上,因此不能在Element上調用。

我可以通過調用Element.GetType()來找出什么派生類型,但是如何才能將該對象實際轉換為ViewSheet ,然后在其上調用ViewSheet.get_Parameter()

由於這種情況經常發生,因此我需要實現某種通用方法,該方法可以接受不同的基類+派生類組合。 任何想法將不勝感激。

收集器方法的示例:

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

這總是返回Element對象集合,因為那是我正在處理的所有對象的基類。 我可以在收集期間進行Linq強制轉換,但我需要知道,根據我的類別,我將收集特定類型的對象,而我現在一開始就不知道。 只有當我實際上收集了所有Element對象並調用GetType() ,我才知道我要處理的類型。

使用as AElement 如果轉換成功,則PossibleViewSheetget_Parameter()不為null,您可以調用get_Parameter()

ViewSheet PossibleViewSheet = AElement as ViewSheet;

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

如果您有許多不同的具體類,則必須定義一個接口

public interface IGetParameter
{
  int get_Parameter();
}

實現所有必需類的接口,並將as -Operator與以下接口配合使用

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規則,試圖做您正在做的事情。 如果要使用“基類”,則它應包含派生類需要實現的所有虛擬方法。 如果不是,則您的“基類”在層次結構中太低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM