加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读