【问题标题】:Creating an anonymous object depending on parameters根据参数创建匿名对象
【发布时间】:2017-06-21 12:41:30
【问题描述】:

为了简化问题,我假设我有一个带有两个布尔参数 getParamA 和 getParamB 的方法。

public JsonResult MyMethod(bool getParamA, bool getParamB)

如果 getParamA == true 和 getParamB == false 有没有像三元运算符这样的方法,例如,我创建了一个这样的匿名对象:

//this is an entityframework query 
var result = entityContext.MyTable.Select(r=> new 
{ 
      paramA = r.paramA // because getParamA = true
      // don't create paramB because getParamB is false  
});

我知道使用两个参数(使用 if else 条件)很容易实现这一点,但如果我们有超过 5 个参数(因为您需要进行所有测试),事情就会变得复杂......

【问题讨论】:

    标签: c#


    【解决方案1】:

    你可以,但它不是真正有效的代码。它使您的代码变得一团糟:

    .Select( r => getParamA && getParamB
                  ? (object)new { A = r.A, B = r.B }
                  : (getParamA ? new { A = r.A }
                               : (getParamB ? new { B = r.B }
                                            : null
                                 )
                    )
           );
    

    更好的选择可能是ExpandoObject,它在内部使用字典来存储其属性和值。

    dynamic eo = new ExpandoObject();
    
    if (getParamA)
    {
        eo.A = r.A;
    }
    
    if (getParamB)
    {
        eo.B = r.B;
    }
    

    【讨论】:

    • 嗯,你问是否可能,答案是肯定的。你应该这样做吗?没有。
    • @MehdiSouregi ExpandoObject 那么呢?
    • 谢谢,可以在上面的 lambda 表达式中实现吗?
    • 哇,正如回答者在您的链接中所说,实现过于复杂:p 所以我将获取所有列,就我而言,恰好是条目上的所有参数都是表上完全相同的参数。我不能在我的情况下使用 ExpandoObject,因为它不可序列化,所以也许我要使用 IDictionnary
    • @MehdiSouregi ExpandoObject 可序列化为 json(例如通过 JSON.NET)。此外 - 它已经实现了IDictionary<string, object>。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    相关资源
    最近更新 更多