2014-10-12 5 views
1

У меня есть класс, как показано нижеВыражение C# - значение Getdefault или преобразование int? в целом

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 int или getdefaultvalue ИНТА, например

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

но когда выполнить последнюю строку Исключение возвращено вокруг типа mismached
, потому что SaleCount is int, но сумма метод return int?
Может ли кто-нибудь мне помочь?

+0

@HamletHakobyan это не сработало –

+0

Хорошо, проблема в вашей привязке? Вы должны показать точное исключение с трассировкой стека, если это возможно для лучшей помощи. –

ответ

0

Вы должны просто изменить Expression.Call строку

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

в коде выше

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

получить значение INT

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