【发布时间】:2016-07-08 03:11:13
【问题描述】:
我想要做的可能有点奇怪。 但是我正在尝试(这是我能解释的最好的)使用反射来获取完整的类属性树名称作为字符串。
成功的例子到目前为止:
通过使用表达式我可以转换:
() => Model.Cargo.Id
进入字符串:
"Model.Cargo.Id"
我现在的问题是,当我在混合中使用数组时,我没有得到数组名称。我得到的只是最后一个属性名称。
不成功的例子:
Model.CargoTasks[j].IsSet
只返回字符串:
"IsSet"
理想情况下我想要以下字符串结果:
"Model.CargoTasks[0].IsSet"
我可能要求有点多才能将索引包含在结果中,但如果这可能的话,那就太棒了。
我用来处理这些例子的代码如下:
public static string ToMemberAccess<TResult>(this Expression<Func<TResult>> expression)
{
// Get the body of the expression
Expression body = expression.Body;
if (body.NodeType != ExpressionType.MemberAccess && body.NodeType != ExpressionType.Convert)
{
throw new ArgumentException("Property expression must be of the form '() => SomeProperty'", "expression");
}
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression)expression.Body).Operand as MemberExpression;
var stuff = GetMemberNames(memberExpression);
stuff.Reverse();
return string.Join(".", stuff);
}
static List<string> GetMemberNames(MemberExpression expression, List<string> actual = null)
{
if (actual == null) actual = new List<string>();
var member = expression.Member;
var subExp = expression.Expression as MemberExpression;
actual.Add(member.Name);
if(subExp != null) actual = GetMemberNames(subExp, actual);
return actual;
}
谢谢提前!任何帮助将不胜感激!
【问题讨论】:
-
你可以通过
expression.ToString()非常接近 - 这将类似于() => value(X).Model.CargoTasks[0].IsSet -
感谢您的回复。但是,我已经对此进行了测试,它返回的内容更像:
Model.CargoTasks.get_Item(value(Resources.AssignTasks.AssignTasks+<>c__DisplayClass5).j).IsSet
标签: c# .net properties linq-expressions