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
实际上是a
B
时,您将无法使用
a
的方法/属性/成员,反之亦然。您需要某种方法来跟踪
myVar
的实际类型。有更好的方法可以做到这一点,比如实现一个公共接口。

您可以将
myVar
定义为
object
。或者
dynamic
。如果可能,您打算如何使用myVar?