使用具有混合属性类型的成员表达式的C#params方法

使用具有混合属性类型的成员表达式的C#params方法,c#,types,properties,expression,params,C#,Types,Properties,Expression,Params,我编写了一个params方法,它接受成员表达式,并观察到编译器不会接受表达式中的混合属性类型。这是我的密码 公共类MyClass { 公共MyMethod列(参数表达式[]表达式) { ... } } 公共类客户 { 属性int Id{get;set;} 属性字符串名称{get;set;} 属性int Age{get;set;} } var mc=新的MyClass(); mc.MyMethod(c=>c.Id,c=>c.Age);//工作正常,使用2个int类型 mc.MyMethod(c=>

我编写了一个params方法,它接受成员表达式,并观察到编译器不会接受表达式中的混合属性类型。这是我的密码

公共类MyClass
{
公共MyMethod列(参数表达式[]表达式)
{ ... }
}
公共类客户
{
属性int Id{get;set;}
属性字符串名称{get;set;}
属性int Age{get;set;}
}
var mc=新的MyClass();
mc.MyMethod(c=>c.Id,c=>c.Age);//工作正常,使用2个int类型
mc.MyMethod(c=>c.Id,c=>c.Name);//结果导致编译错误,使用int和string类型混合

我知道,编译器从关键字params创建了一个数组,但该数组是
表达式类型的

这可以解决吗,而不必用大量MyMethods重载替换params关键字并增加参数列表?

因为您似乎没有一个
TProp
,您也可以将其替换为
对象
,并使其成为非泛型:

public MyMethod<TEntity> Column(params Expression<Func<TEntity, object>>[] expressions)
公共MyMethod列(参数表达式[]表达式)
  • 将参数类型更改为
    表达式

  • 添加以下代码以获取实际成员:

    public void MyMethod(params Expression<Func<TEntity, object>>[] expressions)
    {
        var members = from expression in expressions
                        let cast = expression.Body as UnaryExpression
                        let member = (expression.Body as MemberExpression)
                                    ?? cast.Operand as MemberExpression
                        where member != null
                        select member.Member;
    }
    
    public void MyMethod(参数表达式[]表达式)
    {
    var members=来自表达式中的表达式
    让cast=expression.Body作为一元表达式
    让成员=(expression.Body作为MemberExpression)
    ??将操作数转换为成员表达式
    where成员!=null
    选择成员。成员;
    }
    

  • MyMethod
    到底做什么?是否可以将
    TProp
    替换为
    object
    ?方法签名和示例代码不兼容。如果您有一个可编译的示例,那么它将更容易帮助您。答案是:不。如果您希望泛型类型在您提供的项中不同,则无法使其与
    params
    一起工作。是的,它将使其可编译。但是我怀疑它是否会非常有用,因为您必须使用反射来查看
    表达式中包装的委托的实际类型。Argh,用object替换TProp使其编译,但是,表达式不再是og类型的MemberExpression,我需要它…谢谢,将TProp替换为object,并添加了访问MemberExpression的代码,现在它可以像我所希望的那样工作;)