如何使用 C# 将类的多属性作为方法的参数传递

本文关键字:方法 参数传递 属性 何使用 | 更新日期: 2023-09-27 18:36:36

我有一个将在其他类中继承的类。课程内容:

public T First(Expression<Func<T, string>> OrderBy = null)
{
   string orderby=string.Empty;
   if (OrderBy != null)
   {
      System.Reflection.PropertyInfo orderbyinfo= (System.Reflection.PropertyInfo)  ((MemberExpression)OrderBy.Body).Member;
            orderby = orderbyinfo.Name;
   }
   ...

}

但是错误"无法将lambda表达式转换为委托类型..."使用方法:

public T First(Expression<Func<T, string>> OrderBy = null,Expression<Func<T, string>> GroupBy = null)
{
   string orderby=string.Empty;
   string groupby=string.empty
   if (OrderBy != null)
   {
      System.Reflection.PropertyInfo orderbyinfo= (System.Reflection.PropertyInfo)   ((MemberExpression)OrderBy.Body).Member;
            orderby = orderbyinfo.Name;
   }
   if (GroupBy != null)
   {
      System.Reflection.PropertyInfo groupbyinfo= (System.Reflection.PropertyInfo)  ((MemberExpression)GroupBy.Body).Member;
            groupby = groupbyinfo.Name;
   }
   ...

}

和方法如下:

Article article = new Article();
article.Title="test";
article=article.First(x=>x.Title,y=>y.Status);

请帮帮我!谢谢!!

如何使用 C# 将类的多属性作为方法的参数传递

您收到此错误是因为Status可能不是string并且您的Func只能返回一个string

public T First(
    Expression<Func<T, string>> orderBy = null,
    Expression<Func<T, string>> groupBy = null)

如果您将它们设为通用,您将能够返回任何内容。由于这两个属性可以是不同的类型,因此您需要两个泛型类型(TProperty1 TProperty2),每个泛型类型一个:

public T First<TProperty1, TProperty2>(
    Expression<Func<T, TProperty1>> orderBy = null, 
    Expression<Func<T, TProperty2>> groupBy = null)

例:

class C<T>
{        
    public T First<TProperty1, TProperty2>(
        Expression<Func<T, TProperty1>> orderBy = null, 
        Expression<Func<T, TProperty2>> groupBy = null)
    {
        string orderByName = string.Empty;
        string groupByName = string.Empty;
        if (orderBy != null)
        {
            System.Reflection.PropertyInfo orderByInfo = (System.Reflection.PropertyInfo)((MemberExpression)orderBy.Body).Member;
            orderByName = orderByInfo.Name;
        }
        if (groupBy != null)
        {
            System.Reflection.PropertyInfo groupByInfo = (System.Reflection.PropertyInfo)((MemberExpression)groupBy.Body).Member;
            groupByName = groupByInfo.Name;
        }
        ....
    }
}

用法:这里两个属性都是int

new C<string>().First(x => x.Length, x => x.Length);

但是,如果它们必须string s,则需要将值转换/转换为 string s:

article = article.First(x=>x.Title, y=>y.Status.ToString());

您是否已经阅读了所有错误消息并在此处发布了所有错误消息,您会注意到有一行告诉您有关转换错误的信息:

错误 1 无法将 lambda 表达式转换为委托类型"System.Func",因为块中的某些返回类型不能隐式转换为委托返回类型

错误 2 无法将类型"int"隐式转换为"字符串"