Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从表达式中获取属性名和比较值?_C#_Reflection_Properties_Expression_Func - Fatal编程技术网

C# 如何从表达式中获取属性名和比较值?

C# 如何从表达式中获取属性名和比较值?,c#,reflection,properties,expression,func,C#,Reflection,Properties,Expression,Func,我们在工作中使用的过滤器是 表达式 我们使用的方法如下: TupleSplitFilter(x=>x.姓氏==“Smith”) 我需要创建一个方法,将表达式作为参数,如上图所示,并将其分解为3个值,一个字符串“姓氏”表示属性,一个字符串“==”表示相等比较,以及一个字符串“Smith”表示被比较的值 我成功地从中提取了字符串“姓氏”,但在我的一生中,我无法确定如何确定比较类型(相等)或比较值(“Smith”)取自此处: static readonly List data=new List(){0

我们在工作中使用的过滤器是

表达式>

我们使用的方法如下:

TupleSplitFilter(x=>x.姓氏==“Smith”)

我需要创建一个方法,将表达式>作为参数,如上图所示,并将其分解为3个值,一个字符串“姓氏”表示属性,一个字符串“==”表示相等比较,以及一个字符串“Smith”表示被比较的值

我成功地从中提取了字符串“姓氏”,但在我的一生中,我无法确定如何确定比较类型(相等)或比较值(“Smith”)

取自此处:

static readonly List data=new List(){0,1,2,3,4,5,6,7,8,9};
静态IEnumerable SelectData(表达式选择器)
{
ParameterExpression param=(ParameterExpression)选择器。参数[0];
BinaryExpression操作=(BinaryExpression)选择器.Body;
ParameterExpression left=(ParameterExpression)operation.left;
ConstantExpression right=(ConstantExpression)operation.right;
WriteLine(“分解表达式:{0}=>{1}{2}{3}”,
param.Name,left.Name,operation.NodeType,right.Value);
//...
从数据中的d返回,其中selector.Compile()(d)选择d;
}
静态void Main(字符串[]参数)
{
WriteLine(“data={0}”,string.Join(“,”,SelectData(d=>d>4));
}
分解表达式:d=>d大于4
数据=5,6,7,8,9

前几天让它工作了。最终目标实际上是对这些值进行散列,这样我们就可以从每个过滤器中获得散列值。对于未来的人来说,我最终是如何将其分解的:

private int HashFilter<T>( Expression<Func<T, bool>> filter ) {
  var param = filter.Parameters[0];
  var operation = filter.Body as BinaryExpression;
  var leftParameter = operation.Left as ParameterExpression;
  var leftIndex = operation.Left as MemberExpression;
  var type = operation.Left.GetType().FullName;
  var rightConstant = operation.Right as ConstantExpression;
  object result;
  if ( rightConstant == null ) {
    var rightMember = operation.Right as MemberExpression;
    result = Expression.Lambda( rightMember ).Compile().DynamicInvoke();
  }
  else {
    result = rightConstant.Value;
  }
  var value = result as string;
  var leftHashCode = leftParameter != null ? leftParameter.Name.GetStableHashCode() : leftIndex.Member.Name.GetStableHashCode();
  var operationHashCode = operation.NodeType.ToString().GetStableHashCode();
  unchecked {
    if ( value != null ) {
      return leftHashCode | operationHashCode | value.GetStableHashCode();
    }
    else {
      return leftHashCode | operationHashCode | result.GetHashCode();
    }
  }
}
private int HashFilter(表达式过滤器){
var param=filter.Parameters[0];
var operation=filter.Body作为二进制表达式;
var leftParameter=operation.leftas ParameterExpression;
var leftIndex=operation.Left作为MemberExpression;
var type=operation.Left.GetType().FullName;
var rightConstant=操作。右侧为恒压;
客观结果;
如果(rightConstant==null){
var rightMember=operation.Right作为MemberExpression;
结果=表达式.Lambda(rightMember).Compile().DynamicInvoke();
}
否则{
结果=右常量值;
}
var value=结果为字符串;
var leftHashCode=leftParameter!=null?leftParameter.Name.GetStableHashCode():leftIndex.Member.Name.GetStableHashCode();
var operationHashCode=operation.NodeType.ToString().GetStableHashCode();
未经检查{
if(值!=null){
返回leftHashCode | operationHashCode | value.GetStableHashCode();
}
否则{
返回leftHashCode | operationHashCode | result.GetHashCode();
}
}
}
GetStableHashCode是以下扩展hasing算法(因为对字符串进行哈希运算使用引用,所以“Hi”。GetHashCode()=”Hi“。GetHashCode()的计算结果永远不会为true,但此GetStableHashCode会为true

public static int GetStableHashCode( this string str ) {
  unchecked {
    int hash1 = (5381 << 16) + 5381;
    int hash2 = hash1;

    for ( int i = 0; i < str.Length; i += 2 ) {
      hash1 = ((hash1 << 5) + hash1) ^ str[i];
      if ( i == str.Length - 1 )
        break;
      hash2 = ((hash2 << 5) + hash2) ^ str[i + 1];
    }

    return hash1 + (hash2 * 1566083941);
  }
}
public static int GetStableHashCode(此字符串为str){
未经检查{
int hash1=(5381
public static int GetStableHashCode( this string str ) {
  unchecked {
    int hash1 = (5381 << 16) + 5381;
    int hash2 = hash1;

    for ( int i = 0; i < str.Length; i += 2 ) {
      hash1 = ((hash1 << 5) + hash1) ^ str[i];
      if ( i == str.Length - 1 )
        break;
      hash2 = ((hash2 << 5) + hash2) ^ str[i + 1];
    }

    return hash1 + (hash2 * 1566083941);
  }
}