我想做的可能有点奇怪。但是,我正在尝试使用反射将完整的类属性树名称作为字符串获取。
目前为止成功的示例:
通过使用表达式,我能够转换:
() => 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
。 - Eli ArbelModel.CargoTasks.get_Item(value(Resources.AssignTasks.AssignTasks+<>c__DisplayClass5).j).IsSet
。 - MitchellNZ