【问题标题】:Accessing anonymous type variables访问匿名类型变量
【发布时间】:2013-12-24 00:21:45
【问题描述】:

我有这个代码:

object test = new {a = "3", b = "4"};
Console.WriteLine(test); //I put a breakpoint here

如何访问test 对象的a 属性?当我放一个断点时,Visual Studio 可以看到这个对象的变量......为什么我不能?我真的需要访问那些。

【问题讨论】:

    标签: c# anonymous-types


    【解决方案1】:

    如果您想要编译器支持,那么您应该使用var 而不是object。它应该认识到您有一个具有属性ab 的对象。您在上面的代码中向下转换为object,因此编译器将只有对象属性

    var test = new {a = "3", b = "4"};
    Console.WriteLine(test.a); //I put a breakpoint here
    

    如果您因任何原因无法使用 var,那么您可以查看 dynamicthis grotty hack for passing anonymous types from Skeet

    【讨论】:

    • 好的,但是我不能在这里使用var,因为实际上,test 是在我的类中声明的,它需要是一个对象。
    • 那么也许你不应该使用匿名类型。
    • 无论类型是什么,只要您通过object test = new AnyClass(); 将某些内容分配给对象,您就只能访问 System.Object 可用的方法。当然,除非您将 object 实例转换回特定类型,但您不能对匿名类型执行此操作
    • @ojek 是的,你可能应该只创建类型。匿名类型不是为了传递而构建的。不过,我确实更新了我的答案,为您提供了替代方案
    【解决方案2】:

    如果你不能为你的匿名类使用静态类型,你可以使用dynamic,像这样:

    static object MakeAnonymous() {
        return new {a = "3", b = "4"};
    }
    static void Main(string[] args) {
        dynamic test = MakeAnonymous();
        Console.WriteLine("{0} {1}", test.a, test.b);
    }
    

    这种方法的缺点是编译器不会帮助您检测未定义属性的情况。例如,你可以这样写

    Console.WriteLine("{0} {1}", test.abc, test.xyz); // <<== Runtime error
    

    它会编译,但它会在运行时崩溃。

    【讨论】:

    • 嗯,问题是,我需要访问这些变量,只是为了检查test.c 是否存在......所以我想这对我没有帮助?无论如何,很好的解决方案,谢谢!
    • @ojek 你可以使用this answer,它会帮助你检查一个属性是否存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多