C# lambda表达式的参数
假设我有这个东西C# lambda表达式的参数,c#,C#,假设我有这个东西 class SomeObject { public int id { get; set; } public string name {get;set;} public string description {get;set;} public anotherObject obj {get;set;} } 以及这个扩展方法,如果属性名的名称作为参数发送,它将从列表中删除属性信息 public stat
class SomeObject
{
public int id { get; set; }
public string name {get;set;}
public string description {get;set;}
public anotherObject obj {get;set;}
}
以及这个扩展方法,如果属性名的名称作为参数发送,它将从列表中删除属性信息
public static IList<PropertyInfo> Except(this IList<PropertyInfo> Properties, params string[] PropertiesToExecludeNames)
{
return Properties.Where(p => !(PropertiesToExecludeNames ?? Enumerable.Empty<String>()).Any(s => s == p.Name)).ToList();
}
这还不错,但我正在尝试找到一种方法来避免将属性名作为字符串发送,有没有一种方法可以使此函数使用lambda表达式,以便在将属性写入时在visual studio中获得建议
更新:根据所选答案,以下内容还支持UnaryExpressions
public static IEnumerable<PropertyInfo> GetPropertyInfosExcept<T>(this T obj, params Expression<Func<T, object>>[] lambda)
{
HashSet<string> set = new HashSet<string>(
lambda.Select(l => l.GetMemberInfo() as PropertyInfo)
.Select(x => x.Name));
return typeof(T).GetProperties().Where(p => !set.Contains(p.Name));
}
public static MemberInfo GetMemberInfo(this LambdaExpression expression)
{
return expression.Body is MemberExpression ? ((MemberExpression)expression.Body).Member : ((MemberExpression)(((UnaryExpression)expression.Body).Operand)).Member;
}
public static IEnumerable GetPropertyInfosExcept(此T对象,参数表达式[]lambda)
{
HashSet=newhashset(
lambda.Select(l=>l.GetMemberInfo()作为PropertyInfo)
.选择(x=>x.Name));
返回typeof(T).GetProperties(),其中(p=>!set.Contains(p.Name));
}
公共静态MemberInfo GetMemberInfo(此LambdaExpression表达式)
{
返回表达式.Body是MemberExpression?((MemberExpression)expression.Body).Member:((MemberExpression)((UnaryExpression)expression.Body.Operator)).Member;
}
公共静态IEnumerable GetPropertyInFosCept(
此T obj,参数表达式[]lambda)
{
HashSet=newhashset(
lambda.Select(l=>(l.Body作为MemberExpression.Member作为PropertyInfo)
.选择(x=>x.Name)
);
返回typeof(T).GetProperties(),其中(p=>!set.Contains(p.Name));
}
public static IEnumerable<PropertyInfo> GetPropertyInfosExcept<T>(this T obj, params Expression<Func<T, object>>[] lambda)
{
HashSet<string> set = new HashSet<string>(
lambda.Select(l => l.GetMemberInfo() as PropertyInfo)
.Select(x => x.Name));
return typeof(T).GetProperties().Where(p => !set.Contains(p.Name));
}
public static MemberInfo GetMemberInfo(this LambdaExpression expression)
{
return expression.Body is MemberExpression ? ((MemberExpression)expression.Body).Member : ((MemberExpression)(((UnaryExpression)expression.Body).Operand)).Member;
}
var pInfos = new SomeObject().GetPropertyInfosExcept(x => x.obj, x => x.name)
.ToList();
public static IEnumerable<PropertyInfo> GetPropertyInfosExcept<T>(
this T obj, params Expression<Func<T, object>>[] lambda)
{
HashSet<string> set = new HashSet<string>(
lambda.Select(l => (l.Body as MemberExpression).Member as PropertyInfo)
.Select(x=>x.Name)
);
return typeof(T).GetProperties().Where(p => !set.Contains(p.Name));
}