[英]calling a derived class method on a object cast to base class
我有一個基類Element
和一個派生類ViewSheet
。 當我收集我所有的ViewSheet
對象時,它們將由collector方法ViewSheet
為Element
。 現在,我需要在每個稱為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
。 如果轉換成功,則PossibleViewSheet
的get_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.