понедельник, 6 октября 2014 г.

SPListItem и ExpandoObject

Обычно к элементу списка в SharePoint мы обращаемся так:
SPListItem item = mylist.GetItemById(id);

      
item["FirstName"] =  "John";
item["LastName"] = "Smith";
item["FullName"] = (string)item["FirstName"] +" "+(string)item["LastName"];
item["Amount"] = (int)item["Amount"] + 100;

С применением ExpandoObject код становится более читаемым.
SPListItem item = mylist.GetItemById(id);

dynamic person = item.Expand(); //см. код расширения ниже 
          

person.FirstName = "John";
person.LastName = "Smith";
person.FullName = person.LastName +" "+person.FirstName; 
person.Amount += 100;

item.Inject((object)person); //также см. код расширения
Исходный код расширения:
    public static class SPListMapperExtension
    {
        public static dynamic Expand(this SPListItem listItem)
        {
            dynamic ex = new ExpandoObject();
            var dynFields = listItem.Fields.OfType().Where(x => !x.Hidden && x.CanBeDisplayedInEditForm);
            foreach (var f in dynFields)
            {
                (ex as IDictionary).Add(f.InternalName, listItem[f.InternalName]);
            }
            return ex;
        }

        public static void Inject(this SPListItem listItem, dynamic obj)
        {
            //dynamic o = (dynamic)obj;
            ExpandoObject ex = obj;
            var dynFields = listItem.Fields.OfType().Where(x => !x.Hidden && x.CanBeDisplayedInEditForm);
            foreach (var f in dynFields)
            {
                listItem[f.InternalName] = 
                    (ex as IDictionary)[f.InternalName];
            }

        }
    }