从一直是匿名的对象中提取单个属性?

时间:2014-02-21 04:14:19

标签: c#

我发现的每个答案都依赖于最初是打字对象的匿名对象。我有一个用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,所以整个帖子只是一个解决方法)。

感谢您的帮助!

2 个答案:

答案 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);