怎么向匿名对象动态添加属性?

忆水思寒 2020-06-09 09:05:15
  var classA = new
{
if (true)
{
Name = "aaa";
}
};

想向上述代码一样通过控制语句添加属性,语法不通过,

所以转想把控制语句写在外面,判断后然后让类动态添加属性,没怎么了解过,想问问大家怎么解决的
...全文
837 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
csh000815 2020-06-13
  • 打赏
  • 举报
回复
会影响性能...
忆水思寒 2020-06-12
  • 打赏
  • 举报
回复
强类型当然很好,但有些情况你想把上端传过来的值保存到一个对象,但传的时候可能一次传多个,还可能类型也各不相同,这时怎么解决呢,dynamic加ExpandoObject就可以完美解决了
引用 18 楼 皮皮虾大侠 的回复:
dynamic 是一剂毒药,我始终认为用准确的容器来存放数据才会更好的使用数据,例如用水杯接水,酒杯盛酒,茶壶泡茶,使用dynamic保不准你导致会用夜壶冲咖啡喝
xiaoxiangqing 2020-06-12
  • 打赏
  • 举报
回复
动态对象会牺牲一些效果
忆水思寒 2020-06-12
  • 打赏
  • 举报
回复
引用 25 楼 weixin_48605326 的回复:
我也想要答案
看17楼,二选一都行的
平凡&人生 2020-06-12
  • 打赏
  • 举报
回复
我也想要答案
游北亮 2020-06-12
  • 打赏
  • 举报
回复
引用 23 楼 忆水思寒 的回复:
[quote=引用 22 楼 水边2 的回复:] 可以用Dictionary字典,Value也可以是字典。 或者用现成的JObject。
是的json对象更适合这种需求,我在前面楼层已经说过了,至于Dictionary字典有重复key的限制,不时很满足。[/quote] 这很正常啊,不管是常规对象,还是匿名对象,都不允许有重复key, 你的问题很奇怪。
忆水思寒 2020-06-12
  • 打赏
  • 举报
回复
引用 22 楼 水边2 的回复:
可以用Dictionary字典,Value也可以是字典。 或者用现成的JObject。
是的json对象更适合这种需求,我在前面楼层已经说过了,至于Dictionary字典有重复key的限制,不时很满足。
游北亮 2020-06-12
  • 打赏
  • 举报
回复
引用 21 楼 忆水思寒 的回复:
强类型当然很好,但有些情况你想把上端传过来的值保存到一个对象,但传的时候可能一次传多个,还可能类型也各不相同,这时怎么解决呢,dynamic加ExpandoObject就可以完美解决了
引用 18 楼 皮皮虾大侠 的回复:
dynamic 是一剂毒药,我始终认为用准确的容器来存放数据才会更好的使用数据,例如用水杯接水,酒杯盛酒,茶壶泡茶,使用dynamic保不准你导致会用夜壶冲咖啡喝
楼上也有人回复了,可以用Dictionary字典,Value也可以是字典。 或者用现成的JObject。
锦秀北里 2020-06-11
  • 打赏
  • 举报
回复
如果是json串的话,直接decode成一个json对象使用不可以吗?为什么一定要生成一个动态的类对象呢
忆水思寒 2020-06-11
  • 打赏
  • 举报
回复
sp123说的很对,使用 json类型最适合这个问题的解决,当然ExpandoObject动态添加属性再序列化也是一样。 查了下资料使用Newtonsoft.Json,提供的json类可以这样写
JObject postedJObject = new JObject();
postedJObject.Add("class", apiClass);

String paramString = postedJObject.ToString(Newtonsoft.Json.Formatting.None, null);
//{"class":"apiClass"}
dynamic加ExpandoObject可以这样写
public static dynamic setAttr(dynamic obj, string key, object value)
{
    var dict = (obj as IDictionary<string, object>);
    if (dict.Keys.Contains(key))
    {
        dict[key] = value;
    }
    else
    {
        dict.Add(key, value);
    }
    return obj;
}
 
dynamic obj = new ExpandoObject();
setAttr(obj, key, value);

string paramString JsonConvert.SerializeObject(setAttr(obj,"class","apiClass"))
//{"class":"apiClass"}
最后感谢大家了,上述代码贴出来供后人借鉴吧
  • 打赏
  • 举报
回复
dynamic 是一剂毒药,我始终认为用准确的容器来存放数据才会更好的使用数据,例如用水杯接水,酒杯盛酒,茶壶泡茶,使用dynamic保不准你导致会用夜壶冲咖啡喝
by_封爱 版主 2020-06-09
  • 打赏
  • 举报
回复
如果你的问题是 如何给匿名对象加字段. 那么ExpandoObject可以. 随便加任何东西. 然后序列化. 或者使用dict<string,object> 也可以实现你的需求.. 随便加. 但是看到你这个树形结构的json. 我觉得似乎你的问题 跟所谓的匿名对象 没什么关系.. 因为你结构都是固定的.. 只是 你不知道"结构"到底是什么样..

public class node
{
   public int id...
   public string name..
   public list<node> childnode...
}
这就完了.. 根本没有你所谓的"动态"
正怒月神 2020-06-09
  • 打赏
  • 举报
回复
引用 6 楼 正怒月神 的回复:
回头看看, 发觉自己不明白,你要动态的是属性,还是属性值 如果是动态属性,那么dynamic就好了。 如果是属性值,那么 set; 封装方法,直接添加你的 if条件就好了。
那你按照3楼写没什么问题。
忆水思寒 2020-06-09
  • 打赏
  • 举报
回复
用递归的写法,动态嵌套添加属性 大家有这样写过吗
忆水思寒 2020-06-09
  • 打赏
  • 举报
回复
引用 6 楼 正怒月神 的回复:
回头看看, 发觉自己不明白,你要动态的是属性,还是属性值 如果是动态属性,那么dynamic就好了。 如果是属性值,那么 set; 封装方法,直接添加你的 if条件就好了。
属性和值都需要,因为节点也不是固定的,所以才考虑匿名对象
正怒月神 2020-06-09
  • 打赏
  • 举报
回复
回头看看, 发觉自己不明白,你要动态的是属性,还是属性值 如果是动态属性,那么dynamic就好了。 如果是属性值,那么 set; 封装方法,直接添加你的 if条件就好了。
忆水思寒 2020-06-09
  • 打赏
  • 举报
回复
引用 3 楼 wanghui0380 的回复:
你这么问,我们只能这么回答。 很难知道你项目具体情况,就按你问的回答

 dynamic obj=new ExpandoObject();
                    if (xxx == "1")
                    {
                        obj.a = "1";
                    }
具体需求就是第三个我自己的回答嘛,麻烦再看看
正怒月神 2020-06-09
  • 打赏
  • 举报
回复
看起来,你就是需要一个 dynamic
wanghui0380 2020-06-09
  • 打赏
  • 举报
回复
你这么问,我们只能这么回答。 很难知道你项目具体情况,就按你问的回答

 dynamic obj=new ExpandoObject();
                    if (xxx == "1")
                    {
                        obj.a = "1";
                    }
忆水思寒 2020-06-09
  • 打赏
  • 举报
回复

{
    "id": "33539",
    "name": "Document_Center",
    "aliasname": "DDDDDDD",
    "order": "1",
    "childnode": [
    {
        "id": "33690",
        "name": "Routers",
        "aliasname": "BBBBBB",
        "order": "1",
        "childnode": [
        {
            "id": "132332",
            "name": "CR",
            "aliasname": "HHHHHH",
            "order": "1",
            "childnode": [
            {
                "id": "262805",
                "name": "CR19000",
                "aliasname": "CCCCCCCC",
                "order": "1",
                "childnode": [
                {
	            "id": "262805"
	          }]
           }]
        }]
   }]
}
需求是这样的数据库查询出所有数据后,想动态拼装成层次型的数据格式,现在是想动态组装数据到节点里面怎么做呢
加载更多回复(7)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧