2017-10-20 87 views
-2

假设有一个基类C#我们可以通过类类型作为参数的功能和存取类变量内部方法

class base 
{ 
    int x, y; 
} 

而3衍生类A,B,C与X,Y初始化为一些值。

例如:

class A : base { x = 1; y = 0;} 
class B : base { x = 0; y = 1;}  
class C : base { x = 1; y = 1;} 

有没有办法通过类作为参数传递给方法,并访问类的变量值。 SO,一个可以更新所有3个类的值的函数。

意向:

int call (type classtype) 
{ 
    int xvalue = classtype.x; 
    int yvalue = classtype.y; 
} 

我已经看到了一些帖子activator.CreateInstance(CLASSTYPE)的 How to pass a Class as parameter for a method? [duplicate]

一提,但它并没有回答我们如何可以访问类的变量。

+0

它应该是'INT调用(基地CLASSTYPE)',你会通过实例化对象。 – Legends

+4

*类型*没有这些变量。 *该类型的实例*具有这些变量,因此具有*类型*不会给你任何变量。 – Servy

+0

请显示“类别A,B”的代码 - 非常不清楚您的意思是“类别的变量值”,正如@Servy所说的。如果代码实际上是C#而不是某种伪语言,则可能是指静态类字段/属性*或实例字段/属性。 –

回答

0

您的方法需要接受Type,然后您可以访问静态属性,因为您没有该实例。

int Call(Type classType) 
{ 
    var xvalue = (int)classType.GetProperty("x", BindingFlags.Public | BindingFlags.Static).GetValue(null, null); 
    var yvalue = (int)classType.GetProperty("y", BindingFlags.Public | BindingFlags.Static).GetValue(null, null); 
} 

虽然我有一种感觉,你真正在寻找的只是简单的继承或接口作为你的参数。

+0

而你如何称此方法? – Steve

+0

@Steve'Call(typeof(MyType))' –

+0

这个结果(对我来说)GetProperty返回的null与NRE紧随在 – Steve

-1

你可以改变Call接受A,B,C派生自基类:

int Call(base theClass) 
{ 
    if (theClass is A) 
    { 
     var ax = theClass.x; 
     var ay = theClass.y; 
    } 
    else if (theClass is B) 
    { 
     // etc  
    } 
    // etc 
} 
+2

通常,当你发现自己做这件事时,它就是代码异味的标志。而不是一堆'is'检查,你只要把两个重载'呼叫(A theClass描述)'和'呼叫(B theClass描述)的' –

+1

的事情是功能同为A,B和C,它是没有效率的设置不同每个类的函数/过程,相反,我们应该能够发送一个段,并取决于各个类的创建/访问实例。 –

相关问题