我发现的每个答案都依赖于最初是打字对象的匿名对象。我有一个用return new {x, y, width, height, guid}
初始化的对象,我想得到guid
(我将使用它来获取原始/完整对象)。
private void ListboxContainer_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
object selected = e.AddedItems[0];
selectedObjectText.Text = e.AddedItems[0].ToString();
Console.WriteLine(selected.ToString());
// -> "{ type = tableBlock, x = 100, y = 100, width = 300, height = 50, z = 50, guid = 0f179336-3b38-4e36-94b7-671ffd8017d9 }"
Console.WriteLine(selected.GetType().ToString());
// -> "<>f__AnonymousType2`7[System.String,System.Double,System.Double,System.Double,System.Double,System.Int32,System.String]"
dynamic d = selected;
Console.WriteLine("guid: " + d.guid);
// -> RuntimeBinderException: 'object' does not contain a definition for 'guid'
// What I eventually need to do:
//IDrawable selected = activeMap.GetDrawable(e.AddedItems[0].guid);
}
我正在寻找一种更安全/更高效的方式来获取GUID(我知道),而不是手动解析它的字符串。有关此前发生的事情的更多信息,请查看this帖子(不幸的是,这个帖子已经过了SO,所以整个帖子只是一个解决方法)。
感谢您的帮助!
答案 0 :(得分:3)
如果要将匿名对象返回到动态,则可以在运行时调用该属性,但如果该属性不存在,则会抛出运行时错误。
public dynamic Test()
{
return new {var1 = "", var2 = Guid.NewGuid()};
}
var output = Test();
Console.WriteLine(output.var2);
问题是,你为什么这样做?有什么理由你不能从get go中返回新对象吗?虽然您可以访问动态属性,但这有点危险,不太高效,显然不是类型安全的。
答案 1 :(得分:0)
这个完全相同的代码在这里运行良好(没有这样的&#34; 'object' does not contain a definition for 'guid'
&#34;错误):
object o =
new
{
type = "tableBlock",
x = 100,
y = 100,
width = 300,
height = 50,
z = 50,
guid = Guid.Parse("6d405dcf-9f40-4b2c-8a26-588259aee557")
};
Console.WriteLine(o.ToString());
dynamic d = o;
Console.WriteLine("guid: " + d.guid);