2017-10-20 138 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,它是沒有效率的設置不同每個類的函數/過程,相反,我們應該能夠發送一個段,並取決於各個類的創建/訪問實例。 –

相關問題