asp.net将匿名函数参数转换为字符串
答
编辑以下澄清的要求:
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()
答
根据您的补充说明和要求,可以通过询问的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上找到。
'object.Property'开头的是什么类型? – LukeH 2010-01-06 11:08:52
我试图将强类型属性名称传递给函数。而不是将“Article.Title”编码为字符串,我宁愿传递()=> Article.Title。这更清楚吗? – user10479 2010-01-06 11:12:34