如何访问存储在对象变量中的匿名类型的字段?
How can I access a field in an anonymous type stored in an object variable?
假设我有这样的代码:
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
?
使用dynamic
关键字:
public struct Foo
{
public dynamic obj;
public Foo(int val)
{
obj = new
{
bar = val
};
Console.WriteLine(obj.bar); // is accessible now
}
}
您所做的将无法编译,因为 object
没有 bar
的定义。如果出于某种原因需要保留对匿名类型的引用,则需要使用 dynamic
。请注意,您将没有 compile-time 类型安全,这样做可能会对性能造成轻微影响。
public struct Foo
{
public dynamic obj;
public Foo(int val)
{
obj = new {
bar = val
};
}
public void WriteMyFooBar()
{
Console.WriteLine(obj.bar);
}
}
然而,有人质疑这里使用匿名类型而不是定义一个至少为 bar
提供 getter 的接口。
您可以尝试将类型对象的 obj
转换为 dynamic
然后访问所需的值,或者您可以将 obj
的类型更改为 dynamic
。
试试这个:
Console.WriteLine(((dynamic)obj).bar));
您可以按照其他人的建议使用 dynamic
,或者您可以使用 "prototype" 方法,如下所示:
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);
}
}
效果很好。
假设我有这样的代码:
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
?
使用dynamic
关键字:
public struct Foo
{
public dynamic obj;
public Foo(int val)
{
obj = new
{
bar = val
};
Console.WriteLine(obj.bar); // is accessible now
}
}
您所做的将无法编译,因为 object
没有 bar
的定义。如果出于某种原因需要保留对匿名类型的引用,则需要使用 dynamic
。请注意,您将没有 compile-time 类型安全,这样做可能会对性能造成轻微影响。
public struct Foo
{
public dynamic obj;
public Foo(int val)
{
obj = new {
bar = val
};
}
public void WriteMyFooBar()
{
Console.WriteLine(obj.bar);
}
}
然而,有人质疑这里使用匿名类型而不是定义一个至少为 bar
提供 getter 的接口。
您可以尝试将类型对象的 obj
转换为 dynamic
然后访问所需的值,或者您可以将 obj
的类型更改为 dynamic
。
试试这个:
Console.WriteLine(((dynamic)obj).bar));
您可以按照其他人的建议使用 dynamic
,或者您可以使用 "prototype" 方法,如下所示:
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);
}
}
效果很好。