C# 表达式,该表达式传递一个项列表以及从这些项中选择属性的方法

C# 表达式,该表达式传递一个项列表以及从这些项中选择属性的方法,c#,expression,C#,Expression,这很难解释,因此我将给出一个用法示例,给出以下代码: public class ZipCode { ZipCodeId {get;set;} Name {get;set;} } public class Criteria { List<ZipCode> ZipCodes {get;set;} } 我可以创建一个签名如下的扩展方法: public static void SetVal< T,V,K,Z>(this T crit, Expression&l

这很难解释,因此我将给出一个用法示例,给出以下代码:

public class ZipCode
{
   ZipCodeId {get;set;}
   Name {get;set;}
}
public class Criteria
{
   List<ZipCode> ZipCodes {get;set;}
}
我可以创建一个签名如下的扩展方法:

public static void SetVal< T,V,K,Z>(this T crit, Expression< Func< T, V>> selector, Expression< Func< K,Z>> key, string value)
static void SetVal<T>(this Criteria<T> crit, Expression<Func<Criteria<T>, object>> selector, Expression<Func<T, object>> key, string value)
正如您所看到的,我需要指定我不想指定的每个泛型参数类型,因为它应该从扩展方法的签名推断出来


那么我应该如何修复这个扩展方法呢?

你的意思是喜欢它吗?↓ 

class Program
{
    static void Main(string[] args)
    {
        Criteria crit = new Criteria();
        crit.SetVal<Criteria, List<ZipCode> , ZipCode , string>(c => c.ZipCodes, z => z.ZipCodeId, "some value passed in here");
    }
}

public class ZipCode
{
   public string ZipCodeId {get;set;}
   public string Name {get;set;}

}

public class Criteria
{
  public List<ZipCode> ZipCodes {get;set;}

}

public static class fordynamic
{
    public static void SetVal<T, V, K, Z>(this T crit, Expression<Func<T, V>> selector, Expression<Func<K, Z>> key, string value)
    { 

    }
}

如果我理解正确,您的设计中的一个小改动应该可以提供更好的解决方案: 将标准更改为以下内容:

Public Class Criterial<T> { List<T> Values {get; set;} /* add additional properties */ }
然后,方法应该如下所示:

public static void SetVal< T,V,K,Z>(this T crit, Expression< Func< T, V>> selector, Expression< Func< K,Z>> key, string value)
static void SetVal<T>(this Criteria<T> crit, Expression<Func<Criteria<T>, object>> selector, Expression<Func<T, object>> key, string value)
最终将允许以下代码:

Criteria<ZipCode> c = new Criteria<ZipCode>();
c.SetVal(x => x.Values, y => y.ZipCodeId, "some value passed in here");

不幸的是,我无法更改Criteria对象,它还包含20多个其他集合,该示例被简化,我可能应该在原始问题中说明。我需要更多信息来提供更好的解决方案,问题是-选择器的结果是否必须与键是其属性的类型相同?e、 g:在您的示例中,您对selected使用c.ZipCodes,它返回一个列表-您希望键是ZipCode的属性吗?然后您可以这样做:public static void SetValthis crit、Expression selector、Expression key、string value或将列表更改为ICollection,您可以这样调用它:c.SetValx=>x.ZipCodes,y=>y.ZipCodeId,test;我不确定我是否理解这个答案,主要的例子看起来和我想要避免的版本完全一样,我想要我在问题中提到的简短版本
Criteria<ZipCode> c = new Criteria<ZipCode>();
c.SetVal(x => x.Values, y => y.ZipCodeId, "some value passed in here");