从未知类调用已知属性

时间:2013-06-14 10:35:32

标签: c# .net

我有一个BaseClass,我从中使用继承派生了多个其他类。 在其他地方,我希望能够从这些继承类中的任何一个中检索属性,即使在运行时之前不知道类的类型。

例如,假设我有两个派生自BaseClass的类

FirstClass : BaseClass
SecondClass : BaseClass

我的BaseClass有一个名为ID的属性,它是一个int(在许多其他的中)

在运行时,我的应用程序将接收'或'FirstClass对象或SecondClass对象,但无论哪种方式我都需要检索ID属性。

public int MyMethod(object unknownClass)
{
    int myID = unknownClass.ID; 
    return myID                    //...does not compile
}

public int MyMethod(object unknownClass)
{
    BaseClass tryCasting = (BaseClass)unknownClass;
    int myID = tryCasting.ID;           
    return myID                    //...does not compile either
}

我不确定还有什么可以尝试的。 如果首先没有了解对象类型,我怎样才能获得知道的属性?

3 个答案:

答案 0 :(得分:11)

不要使用对象并使用BaseClass

public int MyMethod(BaseClass unknownClass)
{
    int myID = unknownClass.ID; 
    return myID;                    
}

答案 1 :(得分:2)

请参阅Darren Davies的答案,了解您的ID特定情况。当在派生类中定义属性而不是基类时,此答案中的方法很有用。


使用dynamic代替object。这将使用运行时来检索实际的对象类型。

public int MyMethod(dynamic unknownClass)
{
    int myID = (int)unknownClass.ID; 
    return myID;
}

或者,您可以使用Reflection来检索属性值:

var myID = (int)unknownClass.GetType().GetProperty("ID").GetValue(unknownClass);

答案 2 :(得分:1)

Polymorfism就是答案。您应该知道,当您创建从另一个派生的类时,派生类会立即从基类中获取属性。因此,如果您不重新定义方法(覆盖),当您在派生类上调用方法MyMethod时,它将 总是调用基本方法。所以下一个代码应该运行良好:

BaseClass { 
    private : int id ; 
    public  : int getId { return id ; }
} ;

FirstClass : BaseClass { DO NOT OVERRIDE getID ...} ; 

int main (void) { 
    BaseClass base ; 
    FirstClass first ; 
    base = first ; 
    base.getId() ; //Gets the id of first.
}

这个节目是什么?当您将first分配给base时,您将first类型转换为BaseClass。然后,当您执行base.getId()程序查找时,如果 如果没有调用基本方法,则在FirstClass中重新定义(覆盖)此方法。

希望您发现此信息有用。您应该阅读Bruce Eckels的“Thinking in C ++”的第一章,它是面向对象编程的一个很好的介绍。