我想知道是否有办法动态指定变量的类型。有点像:
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();
}
这样我将根据输入文件指定要声明的变量类型。
答案 0 :(得分: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
和{ {1}}有一名成员B
。动态类型的工作方式是编译器在运行时等待确定变量的类型。 (就CLR而言,a
只是dynamic
类型的变量。)这意味着您将无法使用object
的方法/属性/成员A
实际上是myVar
,反之亦然。您需要某种方式来跟踪B
的实际类型。有更好的方法可以做到这一点,比如实现一个通用的界面。