Func<DomainObject,object> 如何将对象名称作为字符串返回 [重复]
Posted
技术标签:
【中文标题】Func<DomainObject,object> 如何将对象名称作为字符串返回 [重复]【英文标题】:How Func<DomainObject,object> return Object name as string [duplicate] 【发布时间】:2013-12-31 10:25:29 【问题描述】:我有这样的静态方法:
public static string MyMethod(Func<Student, object> func)
return ??? ;
我使用它如下:
var s1 = MyMethod(student => student.ID); // Return "ID" ???
var s2 = MyMethod(student => student.Age); // Return "Age" ???
var s3 = MyMethod(student => student.Name); // Return "Name" ???
如何编写返回以下结果的方法?
s1:“ID” s2:“年龄” s3:“名称”* 将 => 之后的每个属性的名称作为字符串返回
【问题讨论】:
你不能使用这个签名——它必须是Expression<Func<Student, object>>
之类的东西。
【参考方案1】:
您可以更改方法的签名 来自
public static string MyMethod(Func<Student, object> func)
改成
public static string MyMethod(Expression<Func<Student, object>> func)
return GetMemeberName(func)
public static string GetMemberName(Expression expression)
if (expression is LambdaExpression)
var lambdaExpression = (LambdaExpression)expression;
return GetMemberName(lambdaExpression.Body);
if (expression is MemberExpression)
var memberExpression = (MemberExpression)expression;
if (memberExpression.Expression.NodeType == ExpressionType.MemberAccess)
return GetMemberName(memberExpression.Expression)+ "."+ memberExpression.Member.Name;
return memberExpression.Member.Name;
if (expression is UnaryExpression)
var unaryExpression = (UnaryExpression)expression;
if (unaryExpression.NodeType != ExpressionType.Convert)
throw new Exception(string.Format(
"Cannot interpret member from 0",
expression));
return GetMemberName(unaryExpression.Operand);
throw new Exception(string.Format("Could not determine member from 0",expression));
【讨论】:
这很好,但你必须告诉他如何让它发挥作用。 OP 有Func<>
,而不是Expression
。
基本上这是一堆代码,虽然有用,但离回答所述问题还差得很远。如果它被制成一个真正的答案,我会赞成这个。
另请注意,对于Expression
类型的参数,您不能使用lambda 调用它。
@Gabe 添加了一些解释
@Jon 添加了一些细节【参考方案2】:
签名必须涉及表达式树而不是 func 才能检查它。幸运的是,您的调用不会改变,因为编译器会从您的 lambda 表达式中创建表达式。
这个版本可能是最短的,它不涉及递归,但仅适用于简单的属性访问 lambdas。
public static string MyFunc( Expression<Func<Student, object>> Property )
if ( Property != null && Property.Body != null )
if ( Property.Body.NodeType == ExpressionType.MemberAccess )
MemberExpression memberExpression =
(MemberExpression)Property.Body;
if ( !string.IsNullOrEmpty( memberExpression.Member.Name ) )
return memberExpression.Member.Name;
return string.Empty;
【讨论】:
【参考方案3】:来自another SO question,这可能就是您要找的:
public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
return (propertyExpression.Body as MemberExpression).Member.Name;
要使用它,你可以这样写:
var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"
【讨论】:
以上是关于Func<DomainObject,object> 如何将对象名称作为字符串返回 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Python 装饰器@func().attribute 语法错误
vs2015编译ffmpeg 出现错误rtmp.lib(rtmp.obj) : error LNK2001: 无法解析的外部符号 ___iob_func