C# 将属性列表作为强类型参数传递
我有一个从表达式中提取属性名称的方法:C# 将属性列表作为强类型参数传递,c#,C#,我有一个从表达式中提取属性名称的方法: private static string GetPropertyName<TObj, TProp>(Expression<Func<TObj, TProp>> prop) { var expression = prop.Body as MemberExpression; if (expression != null) { var property = expression.Me
private static string GetPropertyName<TObj, TProp>(Expression<Func<TObj, TProp>> prop)
{
var expression = prop.Body as MemberExpression;
if (expression != null)
{
var property = expression.Member as PropertyInfo;
if (property != null)
{
return property.Name;
}
}
return string.Empty;
}
我希望能够一个接一个地传递属性集合。只是想清楚一点,属性可以是不同的类型。可能是我,但我想你不需要这样做。你可以简单地使用C#6
nameof
关键字。这当然是假设您可以使用C#6
string name = nameof(u.Surname);
试试这个:
用法:string[]props=GetPropertiesName((主窗口m)=>m.Lalala,(主窗口m)=>m.Lalala)代码>
私有静态字符串[]GetPropertiesName(参数表达式[]prop)
{
List ret=新列表();
foreach(道具中的var项目)
ret.Add(GetPropertyName(项));
返回返回返回到阵列();
}
私有静态字符串GetPropertyName(表达式属性)
{
var expression=作为MemberExpression的prop.Body;
if(表达式!=null)
{
var property=expression.Member作为PropertyInfo;
if(属性!=null)
{
返回属性。名称;
}
}
返回字符串。空;
}
我完全同意@Patrick及其优于我的方式
但是如果你说你没有使用C#6.0,那么你可以使用你编写的代码。我只使用参数
,收益返回
和一个foreach
循环
private static IEnumerable<string> GetPropertyName<TObj, TProp>(params Expression<Func<TObj, TProp>>[] propCollection)
{
foreach (var prop in propCollection)
{
var expression = prop.Body as MemberExpression;
if (expression != null)
{
var property = expression.Member as PropertyInfo;
if (property != null)
{
yield return property.Name;
}
}
yield return string.Empty;
}
}
您是否能够利用CallerMemberNameAttribute
来完全删除此代码?或者,在C#6中,新的nameof
关键字。@AdamHouldsworthCallerMemberName
如果您想在一个关键字中执行多个调用,则该关键字不可用nameof
确实是。@Patrickhoffman是的,对这个案例没有用处,但我提到它也是为了强调它——它并不总是为人所知。真的。通常它确实非常有用。如果你不想使用C#6.0,你将使用你编写的代码,使用param
并在方法中循环。它将返回属性的名称。StringList当我尝试此操作时,我得到:无法从用法推断方法“SqlQueryString.Core.StringExtensions.GetPropertiesName(string,params System.Linq.Expressions.Expression[])”的类型参数。请尝试显式指定类型参数。@osotorrio请检查udpate
private static string[] GetPropertiesName<TObj, TProp>(params Expression<Func<TObj, TProp>>[] prop)
{
List<string> ret = new List<string>();
foreach (var item in prop)
ret.Add(GetPropertyName(item));
return ret.ToArray();
}
private static string GetPropertyName<TObj, TProp>(Expression<Func<TObj, TProp>> prop)
{
var expression = prop.Body as MemberExpression;
if (expression != null)
{
var property = expression.Member as PropertyInfo;
if (property != null)
{
return property.Name;
}
}
return string.Empty;
}
private static IEnumerable<string> GetPropertyName<TObj, TProp>(params Expression<Func<TObj, TProp>>[] propCollection)
{
foreach (var prop in propCollection)
{
var expression = prop.Body as MemberExpression;
if (expression != null)
{
var property = expression.Member as PropertyInfo;
if (property != null)
{
yield return property.Name;
}
}
yield return string.Empty;
}
}
public static IEnumerable<string> GetPropertiesName<TObj, TProp>(Expression<Func<TObj, TProp[]>> prop)
{
var array = (prop.Body as NewArrayExpression);
var exp = array == null ? null : array.Expressions;
if (exp != null)
{
//var expArr = (prop.Body as NewArrayExpression).Expressions;
foreach (var oneProp in exp)
{
Expression onePropExp;
if (oneProp.GetType() == typeof (UnaryExpression))
{
onePropExp = (oneProp as UnaryExpression).Operand;
}
else
{
onePropExp = oneProp;
}
var property = (onePropExp as MemberExpression).Member as PropertyInfo;
if (property != null)
{
yield return property.Name;
}
yield return string.Empty;
}
}
yield return string.Empty;
}
var propNames = GetPropertiesName((AllSubsTransAndDevices d) => new[]
{
d.CurrentDriverId,
d.GPSDevicesId,
d.TransporterId
});