c# – 如何使用CodeDOM表示空合并运算符?
发布时间:2020-12-15 05:39:01 所属栏目:百科 来源:网络整理
导读:比方说,我有以下简化类型: public class Model{ public decimal? Result { get; set; }} 如何使用CodeDOM表示空合并运算符来生成C#代码,它有可能吗? 现在我正在使用以下解决方法: new CodePropertyReferenceExpression( new CodePropertyReferenceExpress
比方说,我有以下简化类型:
public class Model { public decimal? Result { get; set; } } 如何使用CodeDOM表示空合并运算符来生成C#代码,它有可能吗? new CodePropertyReferenceExpression( new CodePropertyReferenceExpression(modelArgument,"Result"),"Value")) 这等于model.Result.Value,但不是model.Result ?? 0M 更好的解决方法 CodeExpression与model.Result.GetValueOrDefault(0M)相当,适用于可空值类型 new CodeMethodInvokeExpression( new CodeMethodReferenceExpression( new CodePropertyReferenceExpression(modelArgument,"GetValueOrDefault"),new [] { new CodePrimitiveExpression(0m) })), 解决方法
正如人们在评论部分提到的,??运算符只是一个语法糖.如果检查IL代码,您将在HasValue上看到条件,然后调用GetValueOrDefault方法.此方法接受一个参数,如果Nullable对象没有值,将返回该参数,在其他情况下,它将返回Value属性.
尝试使用下一个代码,它只需通过CodeMethodInvokeExpression调用GetValueOrDefault方法,它在语义上等同于null-coallesing运算符的调用.我使用4作为默认值,但在你的情况下省略参数将完成这项工作,因为你需要0m作为小数的默认值. new CodeMethodInvokeExpression( new CodeMethodReferenceExpression( new CodePropertyReferenceExpression(modelArgument,new [] { new CodePrimitiveExpression(0m) })); 注意:在检查GetValueOrDefault之后,我发现它使用HasValue属性.所以不需要调用它两次(因此编译器会在没有优化的情况下使用??运算符时调用它两次.如果启用了优化,它将只调用GetValueOrDefault).方法内容如下: public T GetValueOrDefault(T defaultValue) { if (!this.HasValue) return defaultValue; else return this.value; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |