Код у вас довольно глупый. Возможно, это всего лишь пример, но нет смысла читать строку дважды из файла, просто чтобы сделать сравнение. Прочитайте строку один раз, сохранив ее в переменной, а затем сравните ее с переменной.
Кроме того, вы должны утилизировать свой объект 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
. Есть лучшие способы сделать это, например, реализовать общий интерфейс.
Вы можете определить 'myVar' как' object'. Или 'dynamic'. – Rob
Если бы это было возможно, как вы собираетесь использовать * myVar *? – bit