动态声明不同类型的变量

时间:2016-03-18 04:02:51

标签: 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();
    else if(file.ReadLine() == "Struct B")
        var myVar = new B();
}

这样我将根据输入文件指定要声明的变量类型。

1 个答案:

答案 0 :(得分:0)

你拥有的代码相当愚蠢。也许它只是一个例子,但是从文件中读取字符串两次没有意义,只是为了进行比较。读取字符串一次,将其存储到变量中,然后对变量进行比较。

此外,您应该处置StreamReader对象。更好的是,将其创建包装在using块中,以确保它自动处理。

就您所提出的实际问题而言,您可以使用myVarobject类型声明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的实际类型。有更好的方法可以做到这一点,比如实现一个通用的界面。