Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / CompMod / System / ComponentModel / MemberDescriptor.cs / 1 / MemberDescriptor.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
/*
*/
namespace System.ComponentModel {
using Microsoft.Win32;
using System;
using System.Collections;
using System.ComponentModel.Design;
using System.Diagnostics;
using System.Reflection;
using System.Security.Permissions;
///
///
/// Declares an array of attributes for a member and defines
/// the properties and methods that give you access to the attributes in the array.
/// All attributes must derive from .
///
///
[HostProtection(SharedState = true)]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class MemberDescriptor {
private string name;
private string displayName;
private int nameHash;
private AttributeCollection attributeCollection;
private Attribute[] attributes;
private Attribute[] originalAttributes;
private bool attributesFiltered = false;
private bool attributesFilled = false;
private int metadataVersion;
private string category;
private string description;
///
///
/// Initializes a new instance of the class with the specified and no
/// attributes.
///
///
protected MemberDescriptor(string name) : this(name, null) {
}
///
///
/// Initializes a new instance of the class with the specified
/// and
/// array.
///
///
protected MemberDescriptor(string name, Attribute[] attributes) {
try {
if (name == null || name.Length == 0) {
throw new ArgumentException(SR.GetString(SR.InvalidMemberName));
}
this.name = name;
this.displayName = name;
this.nameHash = name.GetHashCode();
if (attributes != null) {
this.attributes = attributes;
attributesFiltered = false;
}
this.originalAttributes = this.attributes;
}
catch (Exception t) {
Debug.Fail(t.ToString());
throw t;
}
}
///
///
/// Initializes a new instance of the class with the specified .
///
///
protected MemberDescriptor(MemberDescriptor descr) {
this.name = descr.Name;
this.displayName = this.name;
this.nameHash = name.GetHashCode();
this.attributes = new Attribute[descr.Attributes.Count];
descr.Attributes.CopyTo(this.attributes, 0);
attributesFiltered = true;
this.originalAttributes = this.attributes;
}
///
///
/// Initializes a new instance of the class with the name in the specified
/// and the attributes
/// in both the old and the array.
///
///
protected MemberDescriptor(MemberDescriptor oldMemberDescriptor, Attribute[] newAttributes) {
this.name = oldMemberDescriptor.Name;
this.displayName = oldMemberDescriptor.DisplayName;
this.nameHash = name.GetHashCode();
ArrayList newArray = new ArrayList();
if (oldMemberDescriptor.Attributes.Count != 0) {
foreach (object o in oldMemberDescriptor.Attributes) {
newArray.Add(o);
}
}
if (newAttributes != null) {
foreach (object o in newAttributes) {
newArray.Add(o);
}
}
this.attributes = new Attribute[ newArray.Count ];
newArray.CopyTo( this.attributes, 0);
attributesFiltered = false;
this.originalAttributes = this.attributes;
}
///
///
/// Gets or sets an array of
/// attributes.
///
///
protected virtual Attribute[] AttributeArray {
get {
CheckAttributesValid();
FilterAttributesIfNeeded();
return attributes;
}
set {
lock(this) {
attributes = value;
originalAttributes = value;
attributesFiltered = false;
attributeCollection = null;
}
}
}
///
///
/// Gets the collection of attributes for this member.
///
///
public virtual AttributeCollection Attributes {
get {
CheckAttributesValid();
if (attributeCollection == null) {
attributeCollection = CreateAttributeCollection();
}
return attributeCollection;
}
}
///
///
/// Gets the name of the category that the
/// member
/// belongs to, as specified in the .
///
///
public virtual string Category {
get {
if (category == null) {
category = ((CategoryAttribute)Attributes[typeof(CategoryAttribute)]).Category;
}
return category;
}
}
///
///
/// Gets the description of
/// the member as specified in the .
///
///
public virtual string Description {
get {
if (description == null) {
description = ((DescriptionAttribute) Attributes[typeof(DescriptionAttribute)]).Description;
}
return description;
}
}
///
///
/// Gets a value indicating whether the member is browsable as specified in the
/// .
///
///
public virtual bool IsBrowsable {
get {
return((BrowsableAttribute)Attributes[typeof(BrowsableAttribute)]).Browsable;
}
}
///
///
/// Gets the
/// name of the member.
///
///
public virtual string Name {
get {
if (name == null) {
return "";
}
return name;
}
}
///
///
/// Gets the hash
/// code for the name of the member as specified in .
///
///
protected virtual int NameHashCode {
get {
return nameHash;
}
}
///
///
/// Determines whether this member should be set only at
/// design time as specified in the .
///
///
public virtual bool DesignTimeOnly {
get {
return(DesignOnlyAttribute.Yes.Equals(Attributes[typeof(DesignOnlyAttribute)]));
}
}
///
///
/// Gets the name that can be displayed in a window like a
/// properties window.
///
///
public virtual string DisplayName {
get {
DisplayNameAttribute displayNameAttr = Attributes[typeof(DisplayNameAttribute)] as DisplayNameAttribute;
if (displayNameAttr == null || displayNameAttr.IsDefaultAttribute()) {
return displayName;
}
return displayNameAttr.DisplayName;
}
}
///
/// Called each time we access the attribtes on
/// this member descriptor to give deriving classes
/// a chance to change them on the fly.
///
private void CheckAttributesValid() {
if (attributesFiltered) {
if (metadataVersion != TypeDescriptor.MetadataVersion) {
attributesFilled = false;
attributesFiltered = false;
attributeCollection = null;
}
}
}
///
///
///
/// Creates a collection of attributes using the
/// array of attributes that you passed to the constructor.
///
///
protected virtual AttributeCollection CreateAttributeCollection() {
return new AttributeCollection(AttributeArray);
}
///
///
/// Compares this instance to the specified to see if they are equivalent.
/// NOTE: If you make a change here, you likely need to change GetHashCode() as well.
///
///
public override bool Equals(object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (obj.GetType() != GetType()) {
return false;
}
MemberDescriptor mdObj = (MemberDescriptor)obj;
FilterAttributesIfNeeded();
mdObj.FilterAttributesIfNeeded();
if (mdObj.nameHash != nameHash) {
return false;
}
if ((mdObj.category == null) != (category == null) ||
(category != null && !mdObj.category.Equals(category))) {
return false;
}
if ((mdObj.description == null) != (description == null) ||
(description != null && !mdObj.category.Equals(description))) {
return false;
}
if ((mdObj.attributes == null) != (attributes == null)) {
return false;
}
bool sameAttrs = true;
if (attributes != null) {
if (attributes.Length != mdObj.attributes.Length) {
return false;
}
for (int i = 0; i < attributes.Length; i++) {
if (!attributes[i].Equals(mdObj.attributes[i])) {
sameAttrs = false;
break;
}
}
}
return sameAttrs;
}
///
///
/// In an inheriting class, adds the attributes of the inheriting class to the
/// specified list of attributes in the parent class. For duplicate attributes,
/// the last one added to the list will be kept.
///
///
protected virtual void FillAttributes(IList attributeList) {
if (originalAttributes != null) {
foreach (Attribute attr in originalAttributes) {
attributeList.Add(attr);
}
}
}
private void FilterAttributesIfNeeded() {
if (!attributesFiltered) {
IList list;
if (!attributesFilled) {
list = new ArrayList();
try {
FillAttributes(list);
}
catch (Exception e) {
Debug.Fail(name + ">>" + e.ToString());
}
}
else {
list = new ArrayList(attributes);
}
Hashtable hash = new Hashtable(list.Count);
foreach (Attribute attr in list) {
hash[attr.TypeId] = attr;
}
Attribute[] newAttributes = new Attribute[hash.Values.Count];
hash.Values.CopyTo(newAttributes, 0);
lock(this) {
attributes = newAttributes;
attributesFiltered = true;
attributesFilled = true;
metadataVersion = TypeDescriptor.MetadataVersion;
}
}
}
///
///
/// Finds the given method through reflection. This method only looks for public methods.
///
///
protected static MethodInfo FindMethod(Type componentClass, string name, Type[] args, Type returnType) {
return FindMethod(componentClass, name, args, returnType, true);
}
///
///
/// Finds the given method through reflection.
///
///
protected static MethodInfo FindMethod(Type componentClass, string name, Type[] args, Type returnType, bool publicOnly) {
MethodInfo result = null;
if (publicOnly) {
result = componentClass.GetMethod(name, args);
}
else {
result = componentClass.GetMethod(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, args, null);
}
if (result != null && result.ReturnType != returnType) {
result = null;
}
return result;
}
///
/// Try to keep this reasonable in [....] with Equals(). Specifically,
/// if A.Equals(B) returns true, A & B should have the same hash code.
///
public override int GetHashCode() {
return nameHash;
}
///
/// This method returns the object that should be used during invocation of members.
/// Normally the return value will be the same as the instance passed in. If
/// someone associated another object with this instance, or if the instance is a
/// custom type descriptor, GetInvocationTarget may return a different value.
///
protected virtual object GetInvocationTarget(Type type, object instance) {
if (type == null)
{
throw new ArgumentNullException("type");
}
if (instance == null)
{
throw new ArgumentNullException("instance");
}
return TypeDescriptor.GetAssociation(type, instance);
}
///
///
/// Gets a component site
/// for the given component.
///
///
protected static ISite GetSite(object component) {
if (!(component is IComponent)) {
return null;
}
return((IComponent)component).Site;
}
///
///
/// Gets
/// the component
/// that a method should be invoked on.
///
///
[Obsolete("This method has been deprecated. Use GetInvocationTarget instead. http://go.microsoft.com/fwlink/?linkid=14202")]
protected static object GetInvokee(Type componentClass, object component) {
if (componentClass == null)
{
throw new ArgumentNullException("componentClass");
}
if (component == null)
{
throw new ArgumentNullException("component");
}
return TypeDescriptor.GetAssociation(componentClass, component);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
/*
*/
namespace System.ComponentModel {
using Microsoft.Win32;
using System;
using System.Collections;
using System.ComponentModel.Design;
using System.Diagnostics;
using System.Reflection;
using System.Security.Permissions;
///
///
/// Declares an array of attributes for a member and defines
/// the properties and methods that give you access to the attributes in the array.
/// All attributes must derive from .
///
///
[HostProtection(SharedState = true)]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class MemberDescriptor {
private string name;
private string displayName;
private int nameHash;
private AttributeCollection attributeCollection;
private Attribute[] attributes;
private Attribute[] originalAttributes;
private bool attributesFiltered = false;
private bool attributesFilled = false;
private int metadataVersion;
private string category;
private string description;
///
///
/// Initializes a new instance of the class with the specified and no
/// attributes.
///
///
protected MemberDescriptor(string name) : this(name, null) {
}
///
///
/// Initializes a new instance of the class with the specified
/// and
/// array.
///
///
protected MemberDescriptor(string name, Attribute[] attributes) {
try {
if (name == null || name.Length == 0) {
throw new ArgumentException(SR.GetString(SR.InvalidMemberName));
}
this.name = name;
this.displayName = name;
this.nameHash = name.GetHashCode();
if (attributes != null) {
this.attributes = attributes;
attributesFiltered = false;
}
this.originalAttributes = this.attributes;
}
catch (Exception t) {
Debug.Fail(t.ToString());
throw t;
}
}
///
///
/// Initializes a new instance of the class with the specified .
///
///
protected MemberDescriptor(MemberDescriptor descr) {
this.name = descr.Name;
this.displayName = this.name;
this.nameHash = name.GetHashCode();
this.attributes = new Attribute[descr.Attributes.Count];
descr.Attributes.CopyTo(this.attributes, 0);
attributesFiltered = true;
this.originalAttributes = this.attributes;
}
///
///
/// Initializes a new instance of the class with the name in the specified
/// and the attributes
/// in both the old and the array.
///
///
protected MemberDescriptor(MemberDescriptor oldMemberDescriptor, Attribute[] newAttributes) {
this.name = oldMemberDescriptor.Name;
this.displayName = oldMemberDescriptor.DisplayName;
this.nameHash = name.GetHashCode();
ArrayList newArray = new ArrayList();
if (oldMemberDescriptor.Attributes.Count != 0) {
foreach (object o in oldMemberDescriptor.Attributes) {
newArray.Add(o);
}
}
if (newAttributes != null) {
foreach (object o in newAttributes) {
newArray.Add(o);
}
}
this.attributes = new Attribute[ newArray.Count ];
newArray.CopyTo( this.attributes, 0);
attributesFiltered = false;
this.originalAttributes = this.attributes;
}
///
///
/// Gets or sets an array of
/// attributes.
///
///
protected virtual Attribute[] AttributeArray {
get {
CheckAttributesValid();
FilterAttributesIfNeeded();
return attributes;
}
set {
lock(this) {
attributes = value;
originalAttributes = value;
attributesFiltered = false;
attributeCollection = null;
}
}
}
///
///
/// Gets the collection of attributes for this member.
///
///
public virtual AttributeCollection Attributes {
get {
CheckAttributesValid();
if (attributeCollection == null) {
attributeCollection = CreateAttributeCollection();
}
return attributeCollection;
}
}
///
///
/// Gets the name of the category that the
/// member
/// belongs to, as specified in the .
///
///
public virtual string Category {
get {
if (category == null) {
category = ((CategoryAttribute)Attributes[typeof(CategoryAttribute)]).Category;
}
return category;
}
}
///
///
/// Gets the description of
/// the member as specified in the .
///
///
public virtual string Description {
get {
if (description == null) {
description = ((DescriptionAttribute) Attributes[typeof(DescriptionAttribute)]).Description;
}
return description;
}
}
///
///
/// Gets a value indicating whether the member is browsable as specified in the
/// .
///
///
public virtual bool IsBrowsable {
get {
return((BrowsableAttribute)Attributes[typeof(BrowsableAttribute)]).Browsable;
}
}
///
///
/// Gets the
/// name of the member.
///
///
public virtual string Name {
get {
if (name == null) {
return "";
}
return name;
}
}
///
///
/// Gets the hash
/// code for the name of the member as specified in .
///
///
protected virtual int NameHashCode {
get {
return nameHash;
}
}
///
///
/// Determines whether this member should be set only at
/// design time as specified in the .
///
///
public virtual bool DesignTimeOnly {
get {
return(DesignOnlyAttribute.Yes.Equals(Attributes[typeof(DesignOnlyAttribute)]));
}
}
///
///
/// Gets the name that can be displayed in a window like a
/// properties window.
///
///
public virtual string DisplayName {
get {
DisplayNameAttribute displayNameAttr = Attributes[typeof(DisplayNameAttribute)] as DisplayNameAttribute;
if (displayNameAttr == null || displayNameAttr.IsDefaultAttribute()) {
return displayName;
}
return displayNameAttr.DisplayName;
}
}
///
/// Called each time we access the attribtes on
/// this member descriptor to give deriving classes
/// a chance to change them on the fly.
///
private void CheckAttributesValid() {
if (attributesFiltered) {
if (metadataVersion != TypeDescriptor.MetadataVersion) {
attributesFilled = false;
attributesFiltered = false;
attributeCollection = null;
}
}
}
///
///
///
/// Creates a collection of attributes using the
/// array of attributes that you passed to the constructor.
///
///
protected virtual AttributeCollection CreateAttributeCollection() {
return new AttributeCollection(AttributeArray);
}
///
///
/// Compares this instance to the specified to see if they are equivalent.
/// NOTE: If you make a change here, you likely need to change GetHashCode() as well.
///
///
public override bool Equals(object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (obj.GetType() != GetType()) {
return false;
}
MemberDescriptor mdObj = (MemberDescriptor)obj;
FilterAttributesIfNeeded();
mdObj.FilterAttributesIfNeeded();
if (mdObj.nameHash != nameHash) {
return false;
}
if ((mdObj.category == null) != (category == null) ||
(category != null && !mdObj.category.Equals(category))) {
return false;
}
if ((mdObj.description == null) != (description == null) ||
(description != null && !mdObj.category.Equals(description))) {
return false;
}
if ((mdObj.attributes == null) != (attributes == null)) {
return false;
}
bool sameAttrs = true;
if (attributes != null) {
if (attributes.Length != mdObj.attributes.Length) {
return false;
}
for (int i = 0; i < attributes.Length; i++) {
if (!attributes[i].Equals(mdObj.attributes[i])) {
sameAttrs = false;
break;
}
}
}
return sameAttrs;
}
///
///
/// In an inheriting class, adds the attributes of the inheriting class to the
/// specified list of attributes in the parent class. For duplicate attributes,
/// the last one added to the list will be kept.
///
///
protected virtual void FillAttributes(IList attributeList) {
if (originalAttributes != null) {
foreach (Attribute attr in originalAttributes) {
attributeList.Add(attr);
}
}
}
private void FilterAttributesIfNeeded() {
if (!attributesFiltered) {
IList list;
if (!attributesFilled) {
list = new ArrayList();
try {
FillAttributes(list);
}
catch (Exception e) {
Debug.Fail(name + ">>" + e.ToString());
}
}
else {
list = new ArrayList(attributes);
}
Hashtable hash = new Hashtable(list.Count);
foreach (Attribute attr in list) {
hash[attr.TypeId] = attr;
}
Attribute[] newAttributes = new Attribute[hash.Values.Count];
hash.Values.CopyTo(newAttributes, 0);
lock(this) {
attributes = newAttributes;
attributesFiltered = true;
attributesFilled = true;
metadataVersion = TypeDescriptor.MetadataVersion;
}
}
}
///
///
/// Finds the given method through reflection. This method only looks for public methods.
///
///
protected static MethodInfo FindMethod(Type componentClass, string name, Type[] args, Type returnType) {
return FindMethod(componentClass, name, args, returnType, true);
}
///
///
/// Finds the given method through reflection.
///
///
protected static MethodInfo FindMethod(Type componentClass, string name, Type[] args, Type returnType, bool publicOnly) {
MethodInfo result = null;
if (publicOnly) {
result = componentClass.GetMethod(name, args);
}
else {
result = componentClass.GetMethod(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, args, null);
}
if (result != null && result.ReturnType != returnType) {
result = null;
}
return result;
}
///
/// Try to keep this reasonable in [....] with Equals(). Specifically,
/// if A.Equals(B) returns true, A & B should have the same hash code.
///
public override int GetHashCode() {
return nameHash;
}
///
/// This method returns the object that should be used during invocation of members.
/// Normally the return value will be the same as the instance passed in. If
/// someone associated another object with this instance, or if the instance is a
/// custom type descriptor, GetInvocationTarget may return a different value.
///
protected virtual object GetInvocationTarget(Type type, object instance) {
if (type == null)
{
throw new ArgumentNullException("type");
}
if (instance == null)
{
throw new ArgumentNullException("instance");
}
return TypeDescriptor.GetAssociation(type, instance);
}
///
///
/// Gets a component site
/// for the given component.
///
///
protected static ISite GetSite(object component) {
if (!(component is IComponent)) {
return null;
}
return((IComponent)component).Site;
}
///
///
/// Gets
/// the component
/// that a method should be invoked on.
///
///
[Obsolete("This method has been deprecated. Use GetInvocationTarget instead. http://go.microsoft.com/fwlink/?linkid=14202")]
protected static object GetInvokee(Type componentClass, object component) {
if (componentClass == null)
{
throw new ArgumentNullException("componentClass");
}
if (component == null)
{
throw new ArgumentNullException("component");
}
return TypeDescriptor.GetAssociation(componentClass, component);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EdmComplexPropertyAttribute.cs
- XmlDataSourceView.cs
- XmlSchemaGroupRef.cs
- DictionaryGlobals.cs
- TaskExtensions.cs
- ScriptControlDescriptor.cs
- HtmlTernaryTree.cs
- SocketException.cs
- UInt32.cs
- MatrixIndependentAnimationStorage.cs
- SqlUserDefinedTypeAttribute.cs
- SafeViewOfFileHandle.cs
- VerbConverter.cs
- NativeMethods.cs
- TypeConverterValueSerializer.cs
- Int32RectValueSerializer.cs
- Compiler.cs
- ObjectKeyFrameCollection.cs
- UserNamePasswordClientCredential.cs
- StylusShape.cs
- InputQueue.cs
- AnnotationHighlightLayer.cs
- WebPartEditVerb.cs
- OleDbInfoMessageEvent.cs
- ReflectionUtil.cs
- PermissionRequestEvidence.cs
- MergablePropertyAttribute.cs
- ItemContainerGenerator.cs
- ConnectionPoolManager.cs
- ObjectListCommandEventArgs.cs
- Win32.cs
- HttpHandlerActionCollection.cs
- UiaCoreApi.cs
- TableItemPattern.cs
- ObjectPropertyMapping.cs
- DataGridViewTextBoxCell.cs
- CipherData.cs
- SchemeSettingElement.cs
- DataGridViewComboBoxCell.cs
- PeerChannelListener.cs
- DataIdProcessor.cs
- smtppermission.cs
- SQLDecimal.cs
- ShapingEngine.cs
- PropertyGridEditorPart.cs
- TextTreeInsertElementUndoUnit.cs
- Operand.cs
- TokenBasedSet.cs
- SystemIPAddressInformation.cs
- DocumentViewerAutomationPeer.cs
- MdiWindowListStrip.cs
- MemberDomainMap.cs
- CngProvider.cs
- ToolStripSplitButton.cs
- DrawingGroup.cs
- HttpCookiesSection.cs
- RoutingSection.cs
- SafeMILHandle.cs
- PieceDirectory.cs
- DataKey.cs
- controlskin.cs
- VariantWrapper.cs
- VoiceChangeEventArgs.cs
- Action.cs
- TextBoxDesigner.cs
- AbstractSvcMapFileLoader.cs
- WaitHandleCannotBeOpenedException.cs
- Application.cs
- SimpleApplicationHost.cs
- TableCell.cs
- RelatedEnd.cs
- SparseMemoryStream.cs
- ContainerFilterService.cs
- SecurityCapabilities.cs
- AnonymousIdentificationSection.cs
- Base64Stream.cs
- DesignerSerializationVisibilityAttribute.cs
- MeasureItemEvent.cs
- XPathNodeInfoAtom.cs
- CaseCqlBlock.cs
- TdsParserSessionPool.cs
- OutputCacheSection.cs
- SelectionItemProviderWrapper.cs
- SqlDataSourceParameterParser.cs
- InvokeGenerator.cs
- FocusTracker.cs
- OleServicesContext.cs
- TypeDescriptorFilterService.cs
- EditBehavior.cs
- DataGridViewRowsAddedEventArgs.cs
- CurrentTimeZone.cs
- sqlmetadatafactory.cs
- WMIGenerator.cs
- TreeNodeClickEventArgs.cs
- ReturnEventArgs.cs
- webproxy.cs
- AssociatedControlConverter.cs
- EntityContainer.cs
- UIElement3D.cs
- Pkcs7Recipient.cs