【发布时间】:2011-02-05 11:09:00
【问题描述】:
这是Oliver Hanappiposted在stackoverflow上的静态反射代码
private static string GetMemberName(Expression expression)
{
switch (expression.NodeType)
{
case ExpressionType.MemberAccess:
var memberExpression = (MemberExpression)expression;
var supername = GetMemberName(memberExpression.Expression);
if (String.IsNullOrEmpty(supername))
return memberExpression.Member.Name;
return String.Concat(supername, '.', memberExpression.Member.Name);
case ExpressionType.Call:
var callExpression = (MethodCallExpression)expression;
return callExpression.Method.Name;
case ExpressionType.Convert:
var unaryExpression = (UnaryExpression)expression;
return GetMemberName(unaryExpression.Operand);
case ExpressionType.Parameter:
return String.Empty;
default:
throw new ArgumentException("The expression is not a member access or method call expression");
}
}
我有公共包装方法:
public static string Name<T>(Expression<Action<T>> expression)
{
return GetMemberName(expression.Body);
}
public static string Name<T>(Expression<Func<T, object>> expression)
{
return GetMemberName(expression.Body);
}
然后添加我自己的方法快捷方式
public static string ClassMemberName<T>(this T sourceType,Expression<Func<T,object>> expression)
{
return GetMemberName(expression.Body);
}
public static string TMemberName<T>(this IEnumerable<T> sourceList, Expression<Func<T,object>> expression)
{
return GetMemberName(expression.Body);
}
哪些代码示例需要或利用GetMemberName(Expression expression) 开关中的不同分支?这段代码到底能做什么强类型?
【问题讨论】:
-
这个问题对我来说似乎有点奇怪。如果您不知道要使用代码做什么,为什么要扩展它?
-
我知道它的哪些部分是用来做的。我问的是非显而易见的用途。我已经广泛使用了它,但我仍然不知道它的全部功能,或者我所做的是否只使用了它的一个分支。
标签: c# strong-typing static-reflection