对象初始化中的C#条件匿名对象成员

时间:2013-06-07 13:33:59

标签: c# asp.net c#-4.0 anonymous

我构建以下匿名对象:

var obj = new {
    Country = countryVal,
    City = cityVal,
    Keyword = key,
    Page = page
};

我希望只有在其值存在时才将成员包含在对象中。

例如,如果cityVal为null,我不想在对象初始化中添加City

var obj = new {
    Country = countryVal,
    City = cityVal,  //ignore this if cityVal is null 
    Keyword = key,
    Page = page
};

这在C#中是否可行?

4 个答案:

答案 0 :(得分:3)

它甚至不支持编码或反射,所以你最终可以做if-else,如果你真的需要这个

if(string.IsNullOrEmpty(cityVal ))
{
var obj=  new
                {
                    Country= countryVal,
                    Keyword = key,
                    Page = page
                };

// do something
return obj;
}
else
{
var obj=  new
                {
                    Country= countryVal,
                    City = cityVal,
                    Keyword = key,
                    Page = page
                };

//do something 
return obj;
}

答案 1 :(得分:1)

你做不到。

但你可以做的是提供这些属性的默认值(null?)。

var obj=  new
            {
                Country= countryVal,
                City = condition ? cityVal : null,
                Keyword = condition ? key : null,
                Page = condition ? page : null
            };

答案 2 :(得分:0)

如果没有其他条件,您将有。但是,如果您将此序列化为JSON对象 使用newtonsoft JSON可以帮助:

   var json = JsonConvert.SerializeObject(value, Formatting.None,
                    new JsonSerializerSettings
                    {
                        NullValueHandling = NullValueHandling.Ignore
                    });

答案 3 :(得分:0)

您可以使用ExpandoObject和功能扩展方法。

    pubic class SomeClass

        public dynamic DomainFunction(
            object countryVal = null
          , object cityVal = null
          , object key = null
          , object page = null
        )
        {
            dynamic obj = new ExpandoObject();

            cityVal?.Tee(x => obj.City = x);
            countryVal?.Tee(x => obj.Country = x);
            key?.Tee(x => obj.Keyword = x);
            page?.Tee(x => obj.Page = x);

            return obj;
        }

    }

    public static class FunctionalExtensionMethods{

        public static T Tee<T>(this T source, Action<T> action)
        {
          if (action == null)
            throw new ArgumentNullException(nameof (action));
          action(source);
          return source;
        }

    }