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
- Accessible.cs
- GraphicsPathIterator.cs
- GraphicsPathIterator.cs
- oledbmetadatacollectionnames.cs
- XmlReaderDelegator.cs
- DeviceContext2.cs
- TreeBuilder.cs
- XmlSchemaAttribute.cs
- Int32CollectionConverter.cs
- Enum.cs
- BidirectionalDictionary.cs
- SourceLineInfo.cs
- CatalogZoneBase.cs
- MenuStrip.cs
- GridViewCancelEditEventArgs.cs
- RelationshipSet.cs
- DataContract.cs
- XpsImage.cs
- SafeNativeMethods.cs
- PrePrepareMethodAttribute.cs
- DataControlFieldCollection.cs
- HandleExceptionArgs.cs
- TimeSpanStorage.cs
- FixedSOMLineCollection.cs
- RootDesignerSerializerAttribute.cs
- SystemResourceKey.cs
- PrimitiveXmlSerializers.cs
- TextTreePropertyUndoUnit.cs
- ControlBuilderAttribute.cs
- HashUtility.cs
- Timer.cs
- Binding.cs
- NameTable.cs
- FixedElement.cs
- GenericsInstances.cs
- RequestStatusBarUpdateEventArgs.cs
- ButtonStandardAdapter.cs
- OpCellTreeNode.cs
- HostedAspNetEnvironment.cs
- SystemInfo.cs
- GPPOINTF.cs
- MetadataUtil.cs
- SoapBinding.cs
- ResXResourceReader.cs
- PhysicalOps.cs
- Native.cs
- XmlSerializationWriter.cs
- HttpRequest.cs
- CachedBitmap.cs
- FormsAuthenticationCredentials.cs
- BaseResourcesBuildProvider.cs
- CacheVirtualItemsEvent.cs
- RsaEndpointIdentity.cs
- VirtualizedCellInfoCollection.cs
- SmiMetaData.cs
- Assert.cs
- Socket.cs
- SourceLocation.cs
- MappingMetadataHelper.cs
- MethodBuilder.cs
- HostAdapter.cs
- PathStreamGeometryContext.cs
- TextBox.cs
- Cursor.cs
- SoapExtensionTypeElementCollection.cs
- ImageSource.cs
- errorpatternmatcher.cs
- DataGridViewTextBoxCell.cs
- COAUTHINFO.cs
- ListSourceHelper.cs
- PropertyManager.cs
- _ShellExpression.cs
- ViewSimplifier.cs
- XmlEncoding.cs
- FormViewDeletedEventArgs.cs
- HttpCachePolicy.cs
- Errors.cs
- Comparer.cs
- OleCmdHelper.cs
- RbTree.cs
- TypefaceMetricsCache.cs
- mongolianshape.cs
- SqlFormatter.cs
- HwndKeyboardInputProvider.cs
- MetadataLocation.cs
- TraceSwitch.cs
- CookieHandler.cs
- BitmapCodecInfoInternal.cs
- UnmanagedMemoryAccessor.cs
- DataSysAttribute.cs
- HtmlElement.cs
- FileSecurity.cs
- UserPersonalizationStateInfo.cs
- StretchValidation.cs
- DiagnosticsConfigurationHandler.cs
- TdsValueSetter.cs
- HttpAsyncResult.cs
- DictionaryKeyPropertyAttribute.cs
- Parser.cs
- ItemsChangedEventArgs.cs