Вы пробовали ILSpy ?У него даже есть несколько параметров для управления, если вы хотите создать синтаксис «функции» LINQ или from... where
синтаксис (View->Options->Decompiler->Decompile query expression
и Decompile anonymous methods/lambdas
)
Для вашего другого вопроса: SubFunctionEntity.get_Volume
является получателемСвойство Volume
класса SubFunctionEntity
.
(MethodInfo) methodof(SubFunctionEntity.get_Volume)
такое же, как typeof(SubFunctionEntity).GetProperty("Volume").GetGetMethod()
, только выполняется во время компиляции, а не во время выполнения.Проблема в том, что C # не имеет methodof
«функции».
Если вы действительно хотите использовать то, что дал вам Reflector, это «исправленная» версия:
public double? LoadSumRialAmount(long functionId, long? subFunctionId)
{
ParameterExpression expression;
if (!subFunctionId.HasValue)
{
return (from func in base.MetaData.SubFunction
where func.FunctionId == functionId
select func).Select<SubFunctionEntity, double?>(Expression.Lambda<Func<SubFunctionEntity, double?>>(Expression.Multiply(Expression.Property(expression = Expression.Parameter(typeof(SubFunctionEntity), "func"), typeof(SubFunctionEntity).GetProperty("Volume").GetGetMethod()), Expression.Property(expression, typeof(SubFunctionEntity).GetProperty("RialAmount").GetGetMethod())), new ParameterExpression[] { expression })).Sum();
}
return (from func in base.MetaData.SubFunction
where (func.FunctionId == functionId) && (func.SubFunctionId != subFunctionId)
select func).Select<SubFunctionEntity, double?>(Expression.Lambda<Func<SubFunctionEntity, double?>>(Expression.Multiply(Expression.Property(expression = Expression.Parameter(typeof(SubFunctionEntity), "func"), typeof(SubFunctionEntity).GetProperty("Volume").GetGetMethod()), Expression.Property(expression, typeof(SubFunctionEntity).GetProperty("RialAmount").GetGetMethod())), new ParameterExpression[] { expression })).Sum();
}
Обратите внимание, что вам нужно будет использовать:
using System.Linq;
using System.Linq.Expressions;
Ах ... самое сложное выражение: func => (func.Volume * func.RialAmount)
, чтобы вы могли написать метод как:
public double? LoadSumRialAmount(long functionId, long? subFunctionId)
{
if (!subFunctionId.HasValue)
{
return (from func in base.MetaData.SubFunction
where func.FunctionId == functionId
select func).Select(func => (func.Volume * func.RialAmount)).Sum();
}
return (from func in base.MetaData.SubFunction
where (func.FunctionId == functionId) && (func.SubFunctionId != subFunctionId)
select func).Select(func => (func.Volume * func.RialAmount)).Sum();
}
Приложение: проверено, ILSpy производит случайный мусор, похожий, но отличный от Reflector