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