【发布时间】: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
我有这个代码:
object test = new {a = "3", b = "4"};
Console.WriteLine(test); //I put a breakpoint here
如何访问test 对象的a 属性?当我放一个断点时,Visual Studio 可以看到这个对象的变量......为什么我不能?我真的需要访问那些。
【问题讨论】:
标签: c# anonymous-types
如果您想要编译器支持,那么您应该使用var 而不是object。它应该认识到您有一个具有属性a 和b 的对象。您在上面的代码中向下转换为object,因此编译器将只有对象属性
var test = new {a = "3", b = "4"};
Console.WriteLine(test.a); //I put a breakpoint here
如果您因任何原因无法使用 var,那么您可以查看 dynamic 或 this grotty hack for passing anonymous types from Skeet
【讨论】:
var,因为实际上,test 是在我的类中声明的,它需要是一个对象。
object test = new AnyClass(); 将某些内容分配给对象,您就只能访问 System.Object 可用的方法。当然,除非您将 object 实例转换回特定类型,但您不能对匿名类型执行此操作
如果你不能为你的匿名类使用静态类型,你可以使用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 是否存在......所以我想这对我没有帮助?无论如何,很好的解决方案,谢谢!