是否有可能在不创建对象实例的情况下获取对象属性名称字符串
本文关键字:取对象 获取 属性 字符串 情况下 有可能 创建对象 实例 是否 | 更新日期: 2023-09-27 18:14:46
对象实例属性的字符串表示可以用Expression<Func<T>>
:
string propertyName = ((MemberExpression) property.Body).Member.Name;
但是如果我没有(不想创建)实例怎么办?在这种情况下,我如何获得属性名称?
我需要一个字符串来表示某个对象的属性名。
假设有一个实体
public class Customer
{
public int ID;
public string Name;
}
现在我想把这个实体的键表达式传递给其他函数,因此我需要字符串"ID",但我不想像SomeOtherFunction("ID")
那样硬编码字符串,而是使用表达式SomeOtherFunction(ExpressionReader.GetString(() => CustomerInstance.ID))
。我需要提供实体实例。
现在我想做同样的而不需要创建实例
可以使用如下方法签名:
private static string GetPropertyName<TModel, TProperty>(Expression<Func<TModel, TProperty>> property)
{
MemberExpression memberExpression = (MemberExpression)property.Body;
return memberExpression.Member.Name;
}
你可以在没有客户类实例的情况下调用这个方法:
string propertyName = GetPropertyName((Customer c) => c.ID);
当然,在转换到MemberExpression
和访问memberExpression.Member.Name
之前,您应该添加一些正确的表达式类型检查。
不,您不需要实例来分解Expression
。即使表达式需要一个,您也永远不会调用它。
实际上,就像在第一个代码片段中做的那样。
你可以把你的代码改成这样:
SomeOtherFunction(ExpressionReader<Customer>.GetString(c => c.ID))
你明白了吗?
另外:
Customer c = null; // null intentionally
SomeOtherFunction(ExpressionReader.GetString(() => c.ID));
仍然没有问题,因为您没有调用表达式
对于c# 6中操作符的新名称,我建议如下:
private string GetNameMyProperty1(TestC c = null)
{
return nameof(c.MyProperty1);
}
我不确定我完全理解你的意思,但根据我的理解,你可以使用反射。使用这种方法,如果您有希望从中获得属性名的Type
,那么您可以使用以下命令检索属性:
Type someType = typeof(SomeClass);
// Get all properties for a type
PropertyInfo[] properties = someType.GetProperties();
// Get a property from a type by it's name
PropertyInfo property = someType.GetProperty("PropertyName");
一旦您有了PropertyInfo
类的实例,您就可以检索诸如属性名称之类的信息。
有关此方法的更多信息,请参阅MSDN文档。
选择的答案是好的,但不包括UnaryExpressions。当试图获取DateTime的属性时,它将失败:
private static string GetPropertyName<TModel, TProperty>(Expression<Func<TModel, TProperty>> property)
{
if (property.Body is MemberExpression)
{
return ((MemberExpression)property.Body).Member.Name;
}
else
{
var op = ((UnaryExpression)property.Body).Operand;
return ((MemberExpression)op).Member.Name;
}
}