这里有一个更详细的解决方案。该方法接受表示属性或字段的lambda表达式。它计算属性或字段的值,并将其与所有封装类的名称相加。
我想你想有一个类型安全的方法来生成某种类型的结构化/分层标识符编码为类和属性或字段的层次结构。我已经使用这种方法几年了,它有助于防止由简单的拼写错误导致的许多难以捉摸的错误。
代码:
public string GetStructuredName(Expression<Func<object>> nameObject)
{
if (nameObject == null) throw new ArgumentNullException("nameObject");
// find the expression denoting a property or a field
MemberExpression member = null;
switch (nameObject.Body.NodeType)
{
case ExpressionType.MemberAccess:
member = (MemberExpression)nameObject.Body;
break;
case ExpressionType.Convert:
case ExpressionType.ConvertChecked:
member = ((UnaryExpression)nameObject.Body).Operand as MemberExpression;
break;
}
if (member == null) throw new ArgumentNullException("nameObject");
StringBuilder sb = new StringBuilder();
// use the value of the member as the final component of the resulting name
sb.Append(nameObject.Compile().DynamicInvoke());
// use short names of embedded type names as components of the resulting name
Type type = member.Member.DeclaringType;
while (type != null && type != typeof(Object))
{
sb.Insert(0, ".");
sb.Insert(0, type.Name);
type = type.DeclaringType;
}
return sb.ToString();
}
例子:
public class OuterContainer
{
public class InnerContainer
{
public static string Property
{
get { return "value"; }
}
public static int Field = 10;
}
}
GetStructuredName(() => OuterContainer.InnerContainer.Property)
GetStructuredName(() => OuterContainer.InnerContainer.Field)
输出将是:
"OuterContainer.InnerContainer.value"
"OuterContainer.InnerContainer.10"
哇......我完全不明白他是问。你的荣誉(他试图在命名空间的前缀......) – Nix 2010-10-07 16:34:50
-1,你的代码的结果将是''System.String“'。 – 2010-10-07 16:35:48
这不起作用,它甚至不编译,因为SomeStaticClass.SomeInnerStaticClass没有GetType方法。谁在投票回答这个问题? – 2010-10-07 16:39:03