我想实现一种方法,该方法使我能够以后期 /动态方式访问未知 /匿名对象(-graph)的属性(我什至不知道如何正确调用它)。

这是我想实现的示例:

// setup an anonymous object
var a = new { B = new { C = new { I = 33 } } };

// now get the value of a.B.C.I in a late-bound way
var i = Get(a, "B.C.I"); 

这是使用“经典”反思的简单实现:

public static object Get(object obj, string expression)
{
    foreach (var name in expression.Split('.'))
    {
        var property = obj.GetType().GetProperty(name);
        obj = property.GetValue(obj, null);
    }
    return obj;
}

我对C# / .NET 4还有哪些其他选项来实现与上面显示的类似的内容,但可能更简单,更大的性能等?

也许有一些方法可以实现同一件事,这使我可以指定 expression 使用lambda表达式而不是字符串?表达树是否会以任何方式有所帮助(例如 这个问题)?

更新: :对象和表达式通过Web服务调用传递到我的代码中。这就是为什么我使用 objectstring 在我的 Get() 方法。

有帮助吗?

解决方案

实际上 只有表达式作为字符串?是否在编译时知道,只是不知道的类型本身(或者很难表达)?如果是这样的话:

dynamic d = a;
int i = d.B.C.I;

如果你 真的 仅将其作为字符串(例如作为用户输入的数据)使生活变得更加困难,而C#4功能都没有真正帮助您。您可以将其评估为Ironpython脚本或类似的内容...

编辑:好的,更新后,听起来您处于后一种情况 - 在这种情况下,我不知道比使用反射更好。为UIS构建的一些内置属性绑定可能会有所帮助,但我不知道一种访问它的干净方式。

其他提示

如果要使用C#样式,则可以将单声道编译器用作您应用程序中的服务。我在这里描述了如何做到这一点:单声道编译器作为服务(MCS)

作为替代方法,您可以使用反射将所有对象的属性放入ExpandOobject中,然后像字典一样使用它(因为ExpandOobject instrumptiment Invent Instrumptiondicary)。或者,您可以使用json.net并致电 JObject.FromObject, ,它将将常规对象变成可以以字典样式访问的验证(作为额外的好处具有递归图形支持)。最后,您可以使用相同的方法将对象倾倒到字典词典中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top