PropertyEmitterBase.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Design / system / Data / EntityModel / Emitters / PropertyEmitterBase.cs / 1305376 / PropertyEmitterBase.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner       [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 

using System.CodeDom; 
using System.Data.Metadata.Edm;
using System.Data.Services.Design;
using System.Diagnostics;
 
namespace System.Data.EntityModel.Emitters
{ 
    internal abstract class PropertyEmitterBase : MetadataItemEmitter 
    {
        private bool _declaringTypeUsesStandardBaseType; 
        protected PropertyEmitterBase(ClientApiGenerator generator, MetadataItem item, bool declaringTypeUsesStandardBaseType)
            : base(generator, item)
        {
            Debug.Assert(item != null, "item is null"); 
            _declaringTypeUsesStandardBaseType = declaringTypeUsesStandardBaseType;
        } 
 
        /// 
        /// This is where the derived classes supply their emit logic. 
        /// 
        /// The CodeDom representation of the type that the property is being added to.
        protected abstract void EmitProperty(CodeTypeDeclaration typeDecl);
 
        /// 
        /// Validation logic specific to property emitters 
        ///  
        protected override void Validate()
        { 
            VerifyGetterAndSetterAccessibilityCompatability();
            Generator.VerifyLanguageCaseSensitiveCompatibilityForProperty(Item as EdmMember);
        }
 
        /// 
        /// The compiler ensures accessibility on a Setter/Getter is more restrictive than on the Property. 
        /// However accessibility modifiers are not well ordered. Internal and Protected don't go well together 
        /// because neither is more restrictive than others.
        ///  
        private void VerifyGetterAndSetterAccessibilityCompatability()
        {
            if (PropertyEmitter.GetGetterAccessibility(Item) == MemberAttributes.Assembly
                        && PropertyEmitter.GetSetterAccessibility(Item) == MemberAttributes.Family) 
            {
                Generator.AddError(Strings.GeneratedPropertyAccessibilityConflict(Item.Name, "Internal", "Protected"), 
                        ModelBuilderErrorCode.GeneratedPropertyAccessibilityConflict, 
                        EdmSchemaErrorSeverity.Error);
            } 
            else if (PropertyEmitter.GetGetterAccessibility(Item) == MemberAttributes.Family
                        && PropertyEmitter.GetSetterAccessibility(Item) == MemberAttributes.Assembly)
            {
                Generator.AddError(Strings.GeneratedPropertyAccessibilityConflict(Item.Name, "Protected", "Internal"), 
                        ModelBuilderErrorCode.GeneratedPropertyAccessibilityConflict,
                        EdmSchemaErrorSeverity.Error); 
            } 
        }
 
        /// 
        /// Main method for Emitting property code.
        /// 
        /// The CodeDom representation of the type that the property is being added to. 
        public void Emit(CodeTypeDeclaration typeDecl)
        { 
            Validate(); 
            EmitProperty(typeDecl);
        } 

        protected bool AncestorClassDefinesName(string name)
        {
            if (_declaringTypeUsesStandardBaseType && Utils.DoesTypeReserveMemberName(Item.DeclaringType, name, Generator.LanguageAppropriateStringComparer)) 
            {
                return true; 
            } 

            StructuralType baseType = Item.DeclaringType.BaseType as StructuralType; 
            if (baseType != null && baseType.Members.Contains(name))
            {
                return true;
            } 

            return false; 
        } 

        public new EdmMember Item 
        {
            get
            {
                return base.Item as EdmMember; 
            }
        } 
 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK