C# 动态声明不同类型的变量
我想知道是否有一种方法可以动态指定变量的类型。大致如下:C# 动态声明不同类型的变量,c#,C#,我想知道是否有一种方法可以动态指定变量的类型。大致如下: 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(); els
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();
}
这样,我将根据输入文件指定要声明的变量类型 你的代码相当愚蠢。也许这只是一个例子,但是从文件中读取两次字符串,只是为了进行比较,是没有意义的。读取字符串一次,将其存储到变量中,然后与变量进行比较 另外,您应该处理
StreamReader
对象。更好的方法是,使用块将其创建包装在一个中,以确保它被自动释放
就您的实际问题而言,正如所建议的,您可以使用对象
或动态
类型声明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
将相当困难,除非在最简单的情况下,如您在问题中所示,A
和B
都有一个成员A
。动态类型的工作方式是编译器等待确定变量的类型,直到运行时。(就CLR而言,dynamic
只是object
类型的变量)这意味着当myVar
实际上是aB
时,您将无法使用a
的方法/属性/成员,反之亦然。您需要某种方法来跟踪myVar
的实际类型。有更好的方法可以做到这一点,比如实现一个公共接口。您可以将myVar
定义为object
。或者dynamic
。如果可能,您打算如何使用myVar?