Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / fx / src / xsp / System / Web / UI / WebParts / PersonalizableTypeEntry.cs / 2 / PersonalizableTypeEntry.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.UI.WebControls.WebParts {
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Reflection;
///
/// Used to represent a type that has personalizable properties
/// and cache information about it.
///
internal sealed class PersonalizableTypeEntry {
private Type _type;
private IDictionary _propertyEntries;
private PropertyInfo[] _propertyInfos;
public PersonalizableTypeEntry(Type type) {
_type = type;
InitializePersonalizableProperties();
}
public IDictionary PropertyEntries {
get {
return _propertyEntries;
}
}
public ICollection PropertyInfos {
get {
if (_propertyInfos == null) {
PropertyInfo[] propertyInfos = new PropertyInfo[_propertyEntries.Count];
int i = 0;
foreach (PersonalizablePropertyEntry entry in _propertyEntries.Values) {
propertyInfos[i] = entry.PropertyInfo;
i++;
}
// Set field after the values have been computed, so field will not be cached
// if an exception is thrown.
_propertyInfos = propertyInfos;
}
return _propertyInfos;
}
}
private void InitializePersonalizableProperties() {
_propertyEntries = new HybridDictionary(/* caseInsensitive */ false);
// Get all public and non-public instance properties, including those declared on
// base types.
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
PropertyInfo[] props = _type.GetProperties(flags);
// Sorts PropertyInfos according to their DeclaringType. Base types appear before derived types.
Array.Sort(props, new DeclaringTypeComparer());
// For each PropertyInfo, add it to the dictionary if it is personalizable, else remove
// it from the dictionary. We need to remove it from the dictionary, in case the base
// type declared a valid personalizable property of the same name (
if ((props != null) && (props.Length != 0)) {
for (int i = 0; i < props.Length; i++) {
PropertyInfo pi = props[i];
string name = pi.Name;
// Get the PersonalizableAttribute (and include any inherited metadata)
PersonalizableAttribute pa = Attribute.GetCustomAttribute(pi,
PersonalizableAttribute.PersonalizableAttributeType, true) as PersonalizableAttribute;
// If the property is not personalizable, remove it from the dictionary
if (pa == null || !pa.IsPersonalizable) {
_propertyEntries.Remove(name);
continue;
}
// If the property has parameters, or does not have a public get or set
// accessor, throw an exception.
ParameterInfo[] paramList = pi.GetIndexParameters();
if ((paramList != null && paramList.Length > 0) || pi.GetGetMethod() == null || pi.GetSetMethod() == null) {
throw new HttpException(SR.GetString(
SR.PersonalizableTypeEntry_InvalidProperty, name, _type.FullName));
}
// Add the property to the dictionary
_propertyEntries[name] = new PersonalizablePropertyEntry(pi, pa);
}
}
}
// Sorts PropertyInfos according to their DeclaringType. Base types appear before derived types.
private sealed class DeclaringTypeComparer : IComparer {
public int Compare(Object x, Object y) {
Type declaringTypeX = ((PropertyInfo)x).DeclaringType;
Type declaringTypeY = ((PropertyInfo)y).DeclaringType;
if (declaringTypeX == declaringTypeY) {
return 0;
}
else if (declaringTypeX.IsSubclassOf(declaringTypeY)) {
return 1;
}
else {
return -1;
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- WriteFileContext.cs
- ColumnMap.cs
- CroppedBitmap.cs
- SettingsAttributeDictionary.cs
- AnnotationAuthorChangedEventArgs.cs
- BaseUriHelper.cs
- ChtmlTextWriter.cs
- WebBrowserEvent.cs
- PageSettings.cs
- TableLayoutColumnStyleCollection.cs
- NetworkInformationException.cs
- HiddenField.cs
- OleDbReferenceCollection.cs
- TransformGroup.cs
- ConversionValidationRule.cs
- BrowserCapabilitiesFactory.cs
- OperationCanceledException.cs
- IisTraceListener.cs
- DataGridViewCheckBoxCell.cs
- DataControlFieldHeaderCell.cs
- OdbcCommand.cs
- MSAAEventDispatcher.cs
- ResourceDefaultValueAttribute.cs
- LocationUpdates.cs
- ImageSource.cs
- CacheMemory.cs
- AppliedDeviceFiltersDialog.cs
- CurrentChangingEventManager.cs
- NeedSkipTokenVisitor.cs
- Mouse.cs
- ClientConfigurationHost.cs
- ButtonFlatAdapter.cs
- XmlAttributeAttribute.cs
- SqlCacheDependencySection.cs
- PeerCollaborationPermission.cs
- TraceUtility.cs
- DiagnosticsConfiguration.cs
- MouseActionConverter.cs
- WindowsSecurityTokenAuthenticator.cs
- UIElement3D.cs
- FormViewPageEventArgs.cs
- TcpSocketManager.cs
- Config.cs
- DoubleLinkList.cs
- MergeFilterQuery.cs
- CheckBoxRenderer.cs
- ControlBuilderAttribute.cs
- WorkflowRuntime.cs
- PageOutputQuality.cs
- StreamGeometry.cs
- LookupBindingPropertiesAttribute.cs
- UrlPath.cs
- SafeSecurityHandles.cs
- BitmapVisualManager.cs
- shaperfactory.cs
- ScriptControl.cs
- XmlExtensionFunction.cs
- DataTableReaderListener.cs
- LockCookie.cs
- versioninfo.cs
- Rectangle.cs
- RawTextInputReport.cs
- NameValueConfigurationCollection.cs
- SqlDataSourceDesigner.cs
- UserControl.cs
- Condition.cs
- EventItfInfo.cs
- DataGridViewCellLinkedList.cs
- isolationinterop.cs
- AuthorizationRuleCollection.cs
- SimpleApplicationHost.cs
- VBCodeProvider.cs
- ComponentChangedEvent.cs
- DataServiceHostFactory.cs
- SchemaElement.cs
- DoubleLinkList.cs
- InvokeGenerator.cs
- SettingsAttributes.cs
- EdmToObjectNamespaceMap.cs
- DSASignatureFormatter.cs
- ContentElement.cs
- ContextMarshalException.cs
- RoutedEventHandlerInfo.cs
- ClientUtils.cs
- SimpleRecyclingCache.cs
- BindingManagerDataErrorEventArgs.cs
- NativeMethods.cs
- Reference.cs
- BmpBitmapDecoder.cs
- XmlSchemaInfo.cs
- BitmapEffectGroup.cs
- loginstatus.cs
- ExtendedPropertyDescriptor.cs
- ColorConverter.cs
- URLBuilder.cs
- SafeProcessHandle.cs
- XmlCountingReader.cs
- GatewayDefinition.cs
- WebExceptionStatus.cs
- KeyValueSerializer.cs