iT邦幫忙

0

How to union object bool property ?

c#
deh 2021-09-02 10:02:50688 瀏覽
  • 分享至 

  • xImage

各位前輩好
有個只有bool property 的class如下

public class CRUDModel
{
    public bool Create { get; set; }
    public bool Read { get; set; }
    public bool Update { get; set; }
    public bool Delete { get; set; }
}

有三個object如下,要將他們union成一個新的obj怎麼做會比較好?

var obj1 = new CRUDModel{Create =true};
var obj2 = new CRUDModel{Read =true};
var obj3 = new CRUDModel{Delete =true};

目前的作法是將三個加入List內,然後用ForEach對每個property下OR,把值給new obj,但感覺不是很好,屬性現在只有四個,要是有十個二十個就要寫那麼多OR。

var objs = new List<CRUDModel>();
objs.Add(obj1);
objs.Add(obj2);
objs.Add(obj3);
var objNew = new CRUDModel();
objs.ForEach(e => {
    objNew.Create = objNew.Create||e.Create;
    objNew.Read = objNew.Read||e.Read;
    objNew.Update = objNew.Update||e.Update;
    objNew.Delete = objNew.Delete||e.Delete;
});

是可以給class一個Add Method,不過想到的做法還是像上面一樣一個個OR......

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
japhenchen
iT邦超人 1 級 ‧ 2021-09-02 10:22:31
最佳解答

用匿名

var objTotal = new {
            obj1 = new CRUDModel{Create =true},
            obj2 = new CRUDModel{Read =true},
            obj3 = new CRUDModel{Delete =true}
            }

DEMO https://dotnetfiddle.net/9ZEdoG

deh iT邦研究生 1 級 ‧ 2021-09-02 10:50:47 檢舉

太神啦!居然有這種操作!雖然這題已解,不過又想到如果還有obj4、5、6就沒辦法了...而且objTotal不是CRUDModel了...窘

C# 不熟,不知道這樣行不行

objs.ForEach(e => {
    foreach(PropertyInfo p in e.GetType().GetProperties())
    {
        objNew
            .GetType()
            .GetProperty(p.Name)
            .SetValue(objNew, (bool)p.GetValue(objNew) || (bool)p.GetValue(e));
    }
});
deh iT邦研究生 1 級 ‧ 2021-09-02 14:00:45 檢舉

listennn08 可以!跟樓下思路相仿,感謝!

3
qaz11226633
iT邦新手 4 級 ‧ 2021-09-02 11:25:04

這就不限制你的屬性多少了

class Program
    {
        static void Main(string[] args)
        {
            var obj1 = new CRUDModel { Create = true };
            var obj2 = new CRUDModel { Read = true };
            var obj3 = new CRUDModel { Delete = true };

            List<CRUDModel> CRUDModels = new List<CRUDModel> { obj1, obj2, obj3 };
            CRUDModel res = new CRUDModel();
            res = Test(CRUDModels);
        }

        public class CRUDModel
        {
            public bool Create { get; set; }
            public bool Read { get; set; }
            public bool Update { get; set; }
            public bool Delete { get; set; }
        }
        public static CRUDModel Test(List<CRUDModel> CRUDModels)
        {
            CRUDModel res = new CRUDModel();
            foreach (CRUDModel item in CRUDModels)
            {
                PropertyInfo[] propertyInfos = item.GetType().GetProperties();
                foreach (PropertyInfo itemData in propertyInfos)
                {
                    if (!(bool)res.GetType().GetProperty(itemData.Name).GetValue(res))
                    {
                        res.GetType().GetProperty(itemData.Name).SetValue(res, itemData.GetValue(item));
                    }
                }
            }
            return res;
        }
    }

好像回太慢了WW

deh iT邦研究生 1 級 ‧ 2021-09-02 13:59:12 檢舉

相較下用反射來做確實更靈活!沒辦法再給最佳了,只能給個讚,十分感謝!

我要發表回答

立即登入回答