gpt4 book ai didi

c# - 出现错误 : The binary operator Equal is not defined for the types 'System.Guid' and 'System.String'

转载 作者:行者123 更新时间:2023-12-02 00:04:51 31 4
gpt4 key购买 nike

这是我的表达类

        public static class ExpressionBuilder
{
private static MethodInfo containsMethod = typeof(string).GetMethod("Contains");
private static MethodInfo startsWithMethod = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) });
private static MethodInfo endsWithMethod = typeof(string).GetMethod("EndsWith", new Type[] { typeof(string) });


public static Expression<Func<T,
bool>> GetExpression<T>(IList<Filter> filters)
{
if (filters.Count == 0)
return null;

ParameterExpression param = Expression.Parameter(typeof(T), "t");
Expression exp = null;

if (filters.Count == 1)
exp = GetExpression<T>(param, filters[0]);
else if (filters.Count == 2)
exp = GetExpression<T>(param, filters[0], filters[1]);
else
{
while (filters.Count > 0)
{
var f1 = filters[0];
var f2 = filters[1];

if (exp == null)
exp = GetExpression<T>(param, filters[0], filters[1]);
else
exp = Expression.AndAlso(exp, GetExpression<T>(param, filters[0], filters[1]));

filters.Remove(f1);
filters.Remove(f2);

if (filters.Count == 1)
{
exp = Expression.AndAlso(exp, GetExpression<T>(param, filters[0]));
filters.RemoveAt(0);
}
}
}

return Expression.Lambda<Func<T, bool>>(exp, param);
}

private static Expression GetExpression<T>(ParameterExpression param, Filter filter)
{
MemberExpression member = Expression.Property(param, filter.PropertyName);
ConstantExpression constant = Expression.Constant(filter.Value);

switch (filter.Operation)
{
case Op.Equals:
return Expression.Equal(member, Expression.Call(Expression.Convert(Expression.Constant(search.RetrieveGuid), typeof(object)), typeof(object).GetMethod("ToString"))), constant);

case Op.GreaterThan:
return Expression.GreaterThan(member, constant);

case Op.GreaterThanOrEqual:
return Expression.GreaterThanOrEqual(member, constant);

case Op.LessThan:
return Expression.LessThan(member, constant);

case Op.LessThanOrEqual:
return Expression.LessThanOrEqual(member, constant);

case Op.Contains:
return Expression.Call(member, containsMethod, constant);

case Op.StartsWith:
return Expression.Call(member, startsWithMethod, constant);

case Op.EndsWith:
return Expression.Call(member, endsWithMethod, constant);
}

return null;
}

private static BinaryExpression GetExpression<T>
(ParameterExpression param, Filter filter1, Filter filter2)
{
Expression bin1 = GetExpression<T>(param, filter1);
Expression bin2 = GetExpression<T>(param, filter2);

return Expression.AndAlso(bin1, bin2);
}
}

当我通过这段代码生成表达式时

 delegExpFilters = EntityExpression.ExpressionBuilder.GetExpression<Contact>(domainFilter).Compile();

我的domainFilter包含一个列表记录属性字段名称、运算符及其值,我的字段是 GUID

当我调用 GetExpression 时,它给了我错误没有为类型“System.Guid”和“System.String”定义二元运算符 Equal

最佳答案

您没有将过滤器值(字符串)转换为适当的类型:

ConstantExpression constant = Expression.Constant(filter.Value);

假设您有一个名为 Amount 的整数属性过滤器:

var filter = new Filter {
PropertyName = "Amount",
Operation = Op.GreaterThan,
Value = "42"
};

您的代码将生成相当于以下代码的表达式

contract.Amount > "42"

不允许进行此类整数与字符串的比较。

<小时/>

您应该获取属性类型并将过滤器值转换为该类型。步骤如下:

  1. 获取属性类型的类型转换器
  2. 检查是否可以将字符串转换为属性类型
  3. 进行转换(将属性值返回为对象
  4. 创建转换表达式以将属性值从对象转换为属性类型

这是GetExpression方法的代码

var member = Expression.Property(param, filter.PropertyName);
var propertyType = ((PropertyInfo)member.Member).PropertyType;
var converter = TypeDescriptor.GetConverter(propertyType); // 1

if (!converter.CanConvertFrom(typeof(string))) // 2
throw new NotSupportedException();

var propertyValue = converter.ConvertFromInvariantString(filter.Value); // 3
var constant = Expression.Constant(propertyValue);
var valueExpression = Expression.Convert(constant, propertyType); // 4

您应该在返回的二进制表达式中使用此值表达式而不是常量表达式。例如:

case Op.LessThan:
return Expression.LessThan(member, valueExpression);
case Op.Equal:
return Expression.Equal(member, valueExpression);
// etc

为了相等,您也应该使用二进制表达式。现在 Amount 的过滤器将被转换为

 contract.Amount > (int)42

关于c# - 出现错误 : The binary operator Equal is not defined for the types 'System.Guid' and 'System.String' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42768023/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com