2011-09-28 52 views
0

在C#中我有一个基类和一个派生类。如何访问派生类的实例的属性作为参数以基类形式传递

我有有基类作为输入参数

public void SomeFunction(BaseClass InstanceOfDerivedClass) 

有没有一种方法,我可以访问特定的派生类的属性,即使它已经作为一个基类传递的函数?我可以使用GetType或Cast或类似的东西吗?

我明白这些解决方案可能并不优雅,但目前的替代方案是为不同派生类多次重复此功能。

回答

1

你可以这样做(糟糕的方法):

public void SomeFunction(BaseClass instanceOfDerivedClass) 
{ 
    DerivedClass derived = null; 

    if(instanceOfDerivedClass is DerivedClass) 
    { 
     derived = instanceOfDerivedClass as DerivedClass; 
     // Do stuff like : 
     int prop = derived.DerivedProperty; 
    } 
} 

或者,如由Eric(好办法)建议:

public void SomeFunction(BaseClass instanceOfDerivedClass) 
{ 
    DerivedClass derived = instanceOfDerivedClass as DerivedClass; 

    if(derived != null) 
    { 
     // Do stuff like : 
     int prop = derived.DerivedProperty; 
    } 
} 
+7

正确的想法。非常罗嗦的实现。如何简单地'DerivedClass derived = instanceOfDerivedClass作为DerivedClass;如果(派生!=空)...' –

+0

多么可怕的铸造练习... –

+0

@Eric:我修好了,谢谢。 –

4

铸造绝对应该做的伎俩,因为在参考堆是这个类。可能是这样的:

if (InstanceOfDerivedClass is DerivedClass) 

而在该块中,您可以投射它并与之交互。

但更大的问题是,为什么你需要?这听起来像这个方法使用了错误的抽象,如果被接受为参数的类型不是正确的类型。这正在打破Liskov Substitution,看起来像是重构设计的主要候选人。 (其中我们不知道足够的帮助。)

+0

+1用于指出错误的抽象&LSP。 –

+0

你可以扩展一下如何施放它吗?对不起,作为一个noob。 – Caustix

+0

@Caustix:没问题。 Amaud指出,最直观最优雅的方式可能是使用“as”关键字将变量解释为不同的类型。 “InstanceOfDerivedClass作为DerivedClass”在你的代码中值得注意的是你的变量以大写字母开头(这就是为什么StackOverflow上的代码解释器显示它像一个类型)。这不是严格惯用的C#。以小写字母开头更为标准。而且,和以前一样,我不能强调这种类型的铸造不是一个理想的解决方案。它会工作,但这是一个解决方法。 – David

相关问题