5

次の目標を満たす式を作成するにはどうすればよいですか。

public object Eval(object rootObj, string propertyString)

例えば:Eval(person, "Address.ZipCode") => return person.Address.ZipCode

各中間プロパティの型がないため、Expression.PropertyOrField は機能しません。スクリプト ライブラリへの依存関係を作成することは避けたいと思います。

これらの式ツリーは数回実行されるため、これらの式ツリーのキャッシュを保存できるため、式を使用してみます。リフレクションを使用してこれを反復または再帰的に実行できることは承知しています。

4

2 に答える 2

10

次のようなものを探しているようです。

public object Eval(object root, string propertyString)
{
    var propertyNames = propertyString.Split('.');
    foreach(var prop in propertyNames)
    {
        var property = root.GetType().GetProperty(prop);
        if (property == null)
        {
            throw new Exception(...);
        }

        root = property.GetValue(root, null);
    }

    return root;
}

これを使用して作成するにExpressionは:

public Expression Eval(object root, string propertyString)
{
    var propertyNames = propertyString.Split('.');
    ParameterExpression param = Expression.Parameter(root.GetType, "_");
    Expression property = param;
    foreach(var prop in propertyName)
    {
        property = Expression.PropertyOrField(property, prop);
    }

    return Expression.Lambda(property, param);
}
于 2013-05-14T13:43:10.117 に答える
3

これは pswg のコードの再帰バージョンで、Expressions.

public Expression Eval(Expression expression, string property)
{
    var split = property.Split('.');
    if (split.Length == 1)
    {
        return Expression.PropertyOrField(expression, property);
    }
    else
    {
        return Eval(Expression.PropertyOrField(expression, split[0]), property.Replace(split[0] + ".", ""));
    }
}
于 2013-05-14T13:55:22.710 に答える