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));
}