2017-09-05 107 views
0

我有一堂課,我用正常的public Class1(int arg1, int arg2, int arg3) { ... } 進行初始化,這很簡單。 但是我想實現的是參數需要改變。 例如,如果您將1傳遞給arg1,則第二個和第三個參數不會採用Int而是採用float。C#類初始化不同的參數?

是否可以在C#.NET Core中完成? 如果不是,那麼C#中是否有可能? 又如何?

+3

這聽起來像你問的是構造函數重載。你可以在你的對象上創建許多不同的構造函數。 – David

+1

這聽起來像一個奇怪的事情 - 爲什麼你需要使類型依賴於第一個參數?爲什麼不創建不同的重載(並跳過第一個參數)? – UnholySheep

+2

不,這是不可能的。你可能想描述你想要達到的目標,我們可以幫助你選擇其他方法。 –

回答

1

你爲什麼不只是創建兩個不同的重載構造這樣的:

public Class1(int arg1, int arg2, int arg3) { 
    if(arg1 == 1) { 
     throw new InvalidOperationException("Wrong constructor"); 
    } 
    ... 
} 

public Class1(int arg1, float arg2, float arg3) { 
    if(arg1 != 1) { 
     throw new InvalidOperationException("Wrong constructor"); 
    } 
    ... 
} 

或者,如果你喜歡它,沒有例外容易一點(這將是我的首選方式):

public Class1(int arg1, float _arg2, float _arg3) { 
    if(arg1 != 1) { // Your int constructor, use arg2 and arg3 vars declared below 
     int arg2 = (int) _arg2; 
     int arg3 = (int) _arg3; 
     ... 
    } else { 
     // Your float constructor, use the _arg2 and _arg3 as your floats 
     ... 
    } 
} 

您想要的解決方案,以改變變量es在運行時是不可能的,但我認爲我發佈的最後一個代碼非常接近。

+0

很好解釋,謝謝!那樣做了。但浮動物只是一個例子。我正在採取字符串或整數。但第一種選擇正是我所期待的。 –

2

可以重載的構造函數

public Class1(int arg1, float arg3) 
+0

如果這樣做了,那麼消費者可以決定使用哪個超載,而不考慮arg1的值。 –

0

所以我找到了另一個答案。

您可以使用所有參數創建一個構造函數,然後允許它們爲null,然後檢查哪些元素爲null,哪些是設置的。

可能不是做的最好的方式,但它的作品...不是要去使用它,但只要一想到它......