1

我有一个像下面这样的类

public class GrouppedStockGift
{
    public DateTime? TimeCreated { get; set; }
    public int? StoreID { get; set; }
    public int? UserCreated { get; set; }
    public int? WorksID { get; set; }
    public int? WorkOrderCode { get; set; }
    public decimal? GiftPrice { get; set; }
    public decimal? GiftMoney { get; set; }
    public int SaleCount { get; set; }
}

我有创建一个动态表达式生成器,在某些情况下我需要convert int? to intgetdefaultvalueint 例如

var sumMethodint = typeof(Enumerable).GetMethods()
                       .Single(x => x.Name == "Sum"
                                 && x.GetParameters().Count() == 2
                                 && x.GetParameters()[1]
                                     .ParameterType
                                     .GetGenericArguments()[1] == typeof(int?));
sumMethodint = sumMethodint.MakeGenericMethod(typeof(GrouppedStockGift));
Expression<Func<GrouppedStockGift, int?>> SaleCount = y => y.SaleCount;
var SaleCountExtractor = Expression.Call(sumMethodint, parameter, SaleCount);
bindings.Add(
              Expression.Bind(
                           typeof(GrouppedStockGift).GetProperty("SaleCount"),
                           SaleCountExtractor));

但是当执行最后一行异常时返回类型不匹配
,因为SaleCount是int但sum方法返回int?
谁能帮我?

4

2 回答 2

0

您必须将Expression.Call行更改为

var SaleCountExtractor = Expression.Call(Expression.Call(sumMethodint, parameter, SaleCount), "GetValueOrDefault", Type.EmptyTypes);

在上面的代码中

Expression.Call(exp, "GetValueOrDefault", Type.EmptyTypes);

获取 int 的默认值

于 2014-10-12T09:44:14.220 回答
0

我认为问题在于您决定使用Sum返回的重载int?。您应该使用另一个重载,它获取类型的选择Func<T, int>并返回int

var parameter = Expression.Parameter(typeof (IEnumerable<GrouppedStockGift>));
var sumMethodint = typeof(Enumerable).GetMethods()
            .Single(x => x.Name == "Sum"
                        && x.GetParameters().Count() == 2
                        && x.GetParameters()[1]
                            .ParameterType
                            .GetGenericArguments()[1] == typeof(int));
sumMethodint = sumMethodint.MakeGenericMethod(typeof(GrouppedStockGift));
Expression<Func<GrouppedStockGift, int>> saleCount = y => y.SaleCount;
var saleCountExtractor = Expression.Call(sumMethodint, parameter, saleCount);

bindings.Add(Expression.Bind(typeof(GrouppedStockGift).GetProperty("SaleCount"),
                             saleCountExtractor));
于 2014-10-12T10:23:35.817 回答