我有一个基类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规则。如果你想使用"基类",它应该包含派生类需要实现的所有虚方法。如果没有,说明你的"基类"在层次结构中位置太低。