SliverNinja's answer above is correct. I forgot you had to .Add to the collection until I ported some old VB code. I had to set and read a bunch of doc properties, so here are a couple extension methods to read/write from either the BuiltInDocumentProperties or the CustomDocumentProperties in Word. This is NetOffice code, but you can convert it to VSTO by just changing the using statements.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NetOffice.OfficeApi;
using NetOffice.OfficeApi.Enums;
using NetOffice.WordApi;
namespace PalabraAddin {
public static class ExtDocument {
public static T GetCustomProperty<T>(this Document doc, string name, T defaultValue) {
return doc.GetProperty(doc.CustomDocumentProperties, name, defaultValue);
}
public static T GetBuiltInProperty<T>(this Document doc, string name, T defaultValue) {
return doc.GetProperty(doc.BuiltInDocumentProperties, name, defaultValue);
}
public static T SetCustomProperty<T>(this Document doc, string name, T value) {
return doc.SetProperty(doc.CustomDocumentProperties, name, value);
}
public static T SetBuiltInProperty<T>(this Document doc, string name, T value) {
return doc.SetProperty(doc.BuiltInDocumentProperties, name, value);
}
public static T GetProperty<T>(this Document doc, object collection, string name, T defaultValue) {
var properties = (DocumentProperties) collection;
foreach (var prop in properties.Where(prop => prop.Name == name))
return (T) prop.Value;
return defaultValue;
}
public static T SetProperty<T>(this Document doc, object collection, string name, T value) {
var properties = (DocumentProperties) collection;
foreach (var prop in properties.Where(prop => prop.Name == name)) {
if (!((T) prop.Value).Equals(value))
prop.Value = value;
return value;
}
MsoDocProperties propType;
if (value is Boolean)
propType = MsoDocProperties.msoPropertyTypeBoolean;
else if (value is DateTime)
propType = MsoDocProperties.msoPropertyTypeDate;
else if (value is double || value is Single)
propType = MsoDocProperties.msoPropertyTypeFloat;
else if (value is int)
propType = MsoDocProperties.msoPropertyTypeNumber;
else
propType = MsoDocProperties.msoPropertyTypeString;
properties.Add(name, false, propType, value);
return value;
}
}
}