public void PropertyBag_ReadOnly_Delete() { var bag = new PropertyBag(true); bag.SetPropertyNoCheck("foo", false); engine.AddHostObject("bag", bag); TestUtil.AssertException <UnauthorizedAccessException>(() => engine.Execute("delete bag.foo")); }
private static void AddTypeToNamespaceNode(PropertyBag node, Type type) { object value; var name = type.GetRootName(); if (!node.TryGetValue(name, out value)) { node.SetPropertyNoCheck(name, HostType.Wrap(type)); return; } var hostType = value as HostType; if (hostType != null) { var types = new[] { type }.Concat(hostType.Types).ToArray(); var groups = types.GroupBy(testType => testType.GetGenericParamCount()).ToIList(); if (groups.Any(group => group.Count() > 1)) { types = groups.Select(ResolveTypeConflict).ToArray(); } node.SetPropertyNoCheck(name, HostType.Wrap(types)); return; } if (value is PropertyBag) { throw new OperationCanceledException(MiscHelpers.FormatInvariant("Type conflicts with namespace at '{0}'", type.GetLocator())); } throw new OperationCanceledException(MiscHelpers.FormatInvariant("Type conflicts with '{0}' at '{1}'", value.GetFriendlyName(), type.GetLocator())); }
public static IPropertyBag GetTypeLibEnums(this ITypeInfo typeInfo) { var typeLib = typeInfo.GetContainingTypeLib(); var typeLibName = typeLib.GetName(); var rootNode = new PropertyBag(true); var typeInfoCount = typeLib.GetTypeInfoCount(); for (var typeInfoIndex = 0; typeInfoIndex < typeInfoCount; typeInfoIndex++) { typeLib.GetTypeInfo(typeInfoIndex, out typeInfo); var typeInfoName = typeInfo.GetName(); var typeAttr = typeInfo.GetTypeAttr(); if (typeAttr.typekind == TYPEKIND.TKIND_ALIAS) { ITypeInfo refTypeInfo; typeInfo.GetRefTypeInfo(unchecked ((int)(long)typeAttr.tdescAlias.lpValue), out refTypeInfo); typeInfo = refTypeInfo; typeAttr = typeInfo.GetTypeAttr(); } if (typeAttr.typekind == TYPEKIND.TKIND_ENUM) { var varCount = typeAttr.cVars; for (var varIndex = 0; varIndex < varCount; varIndex++) { IntPtr pVarDesc; typeInfo.GetVarDesc(varIndex, out pVarDesc); try { var varDesc = (VARDESC)Marshal.PtrToStructure(pVarDesc, typeof(VARDESC)); if (varDesc.varkind == VARKIND.VAR_CONST) { var varName = typeInfo.GetMemberName(varDesc.memid); object typeLibNodeObj; if (!rootNode.TryGetValue(typeLibName, out typeLibNodeObj) || !(typeLibNodeObj is PropertyBag)) { typeLibNodeObj = new PropertyBag(true); rootNode.SetPropertyNoCheck(typeLibName, typeLibNodeObj); } object typeInfoNodeObj; var typeLibNode = (PropertyBag)typeLibNodeObj; if (!typeLibNode.TryGetValue(typeInfoName, out typeInfoNodeObj) || !(typeInfoNodeObj is PropertyBag)) { typeInfoNodeObj = new PropertyBag(true); typeLibNode.SetPropertyNoCheck(typeInfoName, typeInfoNodeObj); } var typeInfoNode = (PropertyBag)typeInfoNodeObj; typeInfoNode.SetPropertyNoCheck(varName, Marshal.GetObjectForNativeVariant(varDesc.desc.lpvarValue)); } } finally { typeInfo.ReleaseVarDesc(pVarDesc); } } } } return(rootNode); }