2010-01-06 82 views
1

我如何获得这个匿名函数作为字符串返回“object.Property”?asp.net将匿名函数参数转换为字符串

() => object.Property; 

谢谢!

+0

'object.Property'开头的是什么类型? – LukeH 2010-01-06 11:08:52

+0

我试图将强类型属性名称传递给函数。而不是将“Article.Title”编码为字符串,我宁愿传递()=> Article.Title。这更清楚吗? – user10479 2010-01-06 11:12:34

回答

3

编辑以下澄清的要求:

var foo = GetYourObjectFromSomewhere(); 
string bar = ExprToString(() => foo.Property); // bar = "foo.Property" 

// ... 

public static string ExprToString<T>(Expression<Func<T>> e) 
{ 
    // use a stack and a loop so that we can cope with nested properties 
    // for example, "() => foo.First.Second.Third.Fourth.Property" etc 

    Stack<string> stack = new Stack<string>(); 

    MemberExpression me = e.Body as MemberExpression; 
    while (me != null) 
    { 
     stack.Push(me.Member.Name); 

     me = me.Expression as MemberExpression; 
    } 

    return string.Join(".", stack.ToArray()); 
} 

原来的答复:

这不是完全清楚你需要什么,或者什么的 object.Property类型是摆在首位。也许下列其中一个可以做到这一点?

// either 
() => (string)object.Property 

// or 
() => object.Property.ToString() 

2

根据您的补充说明和要求,可以通过询问的Expression<Func<T, TProperty>> instaed一个Func<T, TProperty>的解决这个问题。

您可以实现这个是这样的:

public string GetPropertyName<T, TProperty>(Expression<Func<T, TProperty>> propertyPicker) 
{ 
    MemberExpression me = (MemberExpression)propertyPicker.Body; 
    return me.Member.Name; 
} 

这将允许你这样称呼它:

string name = GetPropertyName(x => x.Property); 

由于存在从Func<T, TResult>Expression<Func<T, TResult>>的隐式转换。

更完整的解释以及可重复使用的API可以在Kzu's blog上找到。