假设我的代码看起来像这样:
public struct Foo
{
public object obj;
public Foo(int val)
{
obj = new {
bar = val
};
Console.WriteLine(obj.bar); // Can't access bar.
}
}
通常我会看到存储在隐式类型变量中的匿名类型,在这种情况下可以正常访问它们的字段。但是我不能在这种情况下隐式输入var,因为obj
是结构中的一个字段,显然无法初始化。那么如何访问字段bar
?
答案 0 :(得分:2)
使用dynamic
关键字:
public struct Foo
{
public dynamic obj;
public Foo(int val)
{
obj = new
{
bar = val
};
Console.WriteLine(obj.bar); // is accessible now
}
}
答案 1 :(得分:2)
由于object
没有bar
的定义,因此您无法编译。如果由于某种原因您需要保留对匿名类型的引用,则需要使用dynamic
。请注意,您不具备编译时类型安全性,并且可能会在执行此操作时遇到轻微的性能损失。
public struct Foo
{
public dynamic obj;
public Foo(int val)
{
obj = new {
bar = val
};
}
public void WriteMyFooBar()
{
Console.WriteLine(obj.bar);
}
}
但是,人们确实在这里质疑匿名类型的使用,而不是定义一个至少为bar
提供getter的接口。
答案 2 :(得分:2)
您可以尝试将obj
类型对象投射到dynamic
,然后访问所需的值,或者您可以将obj
的类型更改为dynamic
。
试试这个:
Console.WriteLine(((dynamic)obj).bar));
答案 3 :(得分:1)
您可以像其他人建议的那样使用dynamic
,也可以使用“原型”方法,如下所示:
public struct Foo
{
public object obj;
public Foo(int val)
{
obj = new {
bar = val
};
this.Use(new { bar = 0 }, x => Console.WriteLine(x.bar));
}
public void Use<T>(T prototype, Action<T> action)
{
action((T)this.obj);
}
}
这很好用。