SharePoint: How to set Id to just created SPContentType
When adding Content Type programmatically, sometimes you may need to set a certain Id to it, to ensure that other parts of the application can refer to the Content Type using a known identifier. If you use SharePoint 2010 you can get this done instantly, as SharePoint 2010 provides a handy SPContentType constructor, which accepts SPContentTypeId as parameter:
public SPContentType(SPContentTypeId contentTypeId, SPContentTypeCollection contentTypes, string name);
But if you use SharePoint 2007, you don’t have such a constructor or any built-in means to set the required identifier. Besides, the Id property of SPContentType appears to be read-only. After studying the SPContentType class with Reflector I’ve discovered that the Content Type id is stored in the private m_id property:
private SPContentTypeId m_id;
This means that we can use Reflection to set this property. Here is a special SetContentTypeId method I’ve implemented for doing that:
public void SetContentTypeId(SPContentType spContentType, SPContentTypeId contentTypeId) { try { FieldInfo fi = typeof(SPContentType).GetField("m_id", BindingFlags.NonPublic | BindingFlags.Instance); fi.SetValue(spContentType, contentTypeId); } catch (Exception ex) { Console.Write(string.Format("Couldn't set content type id! {0}", ex.Message)); } }
The method accepts the instance of the SPContentType class and the required identifier as the instance of the SPContentTypeId class. Here is an example of use:
public void AddSomeNewContentType(SPWeb spWeb, SPList spList) { SPContentType parentContentType = spWeb.AvailableContentTypes["some parent content type name"]; if (parentContentType != null) { SPContentType spContentType = new SPContentType(parentContentType, spList.ContentTypes, "some new content type name"); SetContentTypeId(spContentType, new SPContentTypeId("0x0100078C8B39671A4532AB9C5AB6DCB388A6")); // content type id you need has to be here, for example 0x0100078C8B39671A4532AB9C5AB6DCB388A6 // set other properties of content type spList.ContentTypes.Add(spContentType); spContentType.Update(); spList.Update(); } }
Please note that you must NOT use the SetContentTypeId method with existing built-in or earlier created Content Types. Otherwise, it may corrupt the SharePoint data integrity, especially when there are list items created based on the changed Content Type.
Note again, use the SetContentTypeId method ONLY immediately following the creation of a Content Type and ONLY before adding it to whatever collection of Content Types or before calling SPContentType.Update(). This is very important.
My next post describes how to add Content Type programmatically.