2016-03-18 28 views
0

我想知道是否有辦法動態地指定變量的類型。沿線的東西:動態聲明不同類型的變量

public struct A 
{ 
    int a, b; 
} 

public struct B 
{ 
    double a, b; 
} 

public static int Main() 
{ 
    var file = new StreamReader("input.txt"); 

    if(file.ReadLine() == "Struct A") 
     var myVar = new A(); 
    else if(file.ReadLine() == "Struct B") 
     var myVar = new B(); 
} 

這樣,我將指定什麼類型的變量聲明取決於輸入文件。

+2

您可以將'myVar'定義爲'object'。或者'動態'。 – Rob

+0

如果可能的話,你打算如何使用* myVar *? – bit

回答

0

您擁有的代碼相當愚蠢。也許這只是一個例子,但從文件中讀取兩次字符串沒有意義,只是爲了做一個比較。讀取一次字符串,將其存儲到一個變量中,然後對變量進行比較。

此外,您應該處置您的StreamReader對象。更好的是,將其創建包裝在using區塊中以確保其自動處置。

就你所說的實際問題而言,你可以用objectdynamic類型聲明myVar變量。

當與條件操作相結合時,這也將解決您的變量範圍問題。

總之,類似如下:

public static int Main() 
{ 
    dynamic myVar; 
    using (var file = new StreamReader("input.txt")) 
    { 
     var line = file.ReadLine(); 
     if (line == "Struct A") 
      myVar = new A(); 
     else if (line == "Struct B") 
      myVar = new B(); 
     else 
      // You really should be handling the case where the line in the file 
      // contains neither "Struct A" or "Struct B". That will result in 
      // myVar being left in an invalid, uninitialized state. 
      throw new InvalidOperationException(); 
    } 

    // do something with myVar, e.g.: 
    return myVar.a; 
} 

當然,這不是一個銀彈。 使用myVar除了最簡單的情況,例如您在問題中顯示的情況,其中AB都有一個成員a,將會非常困難。動態類型的工作方式是編譯器等待直到運行時才確定變量的類型。 (就CLR而言,dynamic只是object類型的變量。)這意味着當myVar實際上是B時,您將無法使用A的方法/屬性/成員,反之亦然。你需要一些方法來跟蹤myVar的實際類型。有更好的方法來做這件事,比如實現一個通用接口。