2016-03-18 7 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'. Или 'dynamic'. – Rob

+0

Если бы это было возможно, как вы собираетесь использовать * myVar *? – bit

ответ

0

Код у вас довольно глупый. Возможно, это всего лишь пример, но нет смысла читать строку дважды из файла, просто чтобы сделать сравнение. Прочитайте строку один раз, сохранив ее в переменной, а затем сравните ее с переменной.

Кроме того, вы должны утилизировать свой объект StreamReader. Еще лучше заверните его создание в блок using, чтобы убедиться, что он автоматически удаляется.

Насколько ваша фактическая проблема, как было предложено, вы можете объявить переменную myVar либо с помощью object, либо dynamic.

В сочетании с условной операцией это также решит проблему с переменной областью.

Все вместе, что-то вроде следующего:

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, за исключением простейшего случая, как тот, который вы указали в вопросе, где оба A и B имеют член a. Способ работы динамического ввода заключается в том, что компилятор ждет определения типа переменной до времени выполнения. (Что касается CLR, то dynamic является просто переменной типа object.) Это означает, что вы не сможете использовать методы/свойства/члены A, когда myVar фактически является B и наоборот. Вам понадобится какой-то способ отслеживания фактического типа myVar. Есть лучшие способы сделать это, например, реализовать общий интерфейс.

Смежные вопросы