diff options
author | Jiyoung Yun <jy910.yun@samsung.com> | 2016-11-23 19:09:09 +0900 |
---|---|---|
committer | Jiyoung Yun <jy910.yun@samsung.com> | 2016-11-23 19:09:09 +0900 |
commit | 4b4aad7217d3292650e77eec2cf4c198ea9c3b4b (patch) | |
tree | 98110734c91668dfdbb126fcc0e15ddbd93738ca /src/mscorlib/src/System/Reflection/Emit/PropertyBuilder.cs | |
parent | fa45f57ed55137c75ac870356a1b8f76c84b229c (diff) | |
download | coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.tar.gz coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.tar.bz2 coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.zip |
Imported Upstream version 1.1.0upstream/1.1.0
Diffstat (limited to 'src/mscorlib/src/System/Reflection/Emit/PropertyBuilder.cs')
-rw-r--r-- | src/mscorlib/src/System/Reflection/Emit/PropertyBuilder.cs | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/Reflection/Emit/PropertyBuilder.cs b/src/mscorlib/src/System/Reflection/Emit/PropertyBuilder.cs new file mode 100644 index 0000000000..5ac69f205f --- /dev/null +++ b/src/mscorlib/src/System/Reflection/Emit/PropertyBuilder.cs @@ -0,0 +1,306 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/*============================================================ +** +** +** +** +** +** Propertybuilder is for client to define properties for a class +** +** +===========================================================*/ +namespace System.Reflection.Emit { + + using System; + using System.Reflection; + using CultureInfo = System.Globalization.CultureInfo; + using System.Security.Permissions; + using System.Runtime.InteropServices; + using System.Diagnostics.Contracts; + + // + // A PropertyBuilder is always associated with a TypeBuilder. The TypeBuilder.DefineProperty + // method will return a new PropertyBuilder to a client. + // + [HostProtection(MayLeakOnAbort = true)] + [ClassInterface(ClassInterfaceType.None)] + [ComDefaultInterface(typeof(_PropertyBuilder))] + [System.Runtime.InteropServices.ComVisible(true)] + public sealed class PropertyBuilder : PropertyInfo, _PropertyBuilder + { + + // Make a private constructor so these cannot be constructed externally. + private PropertyBuilder() {} + + // Constructs a PropertyBuilder. + // + internal PropertyBuilder( + ModuleBuilder mod, // the module containing this PropertyBuilder + String name, // property name + SignatureHelper sig, // property signature descriptor info + PropertyAttributes attr, // property attribute such as DefaultProperty, Bindable, DisplayBind, etc + Type returnType, // return type of the property. + PropertyToken prToken, // the metadata token for this property + TypeBuilder containingType) // the containing type + { + if (name == null) + throw new ArgumentNullException("name"); + if (name.Length == 0) + throw new ArgumentException(Environment.GetResourceString("Argument_EmptyName"), "name"); + if (name[0] == '\0') + throw new ArgumentException(Environment.GetResourceString("Argument_IllegalName"), "name"); + Contract.EndContractBlock(); + + m_name = name; + m_moduleBuilder = mod; + m_signature = sig; + m_attributes = attr; + m_returnType = returnType; + m_prToken = prToken; + m_tkProperty = prToken.Token; + m_containingType = containingType; + } + + //************************************************ + // Set the default value of the Property + //************************************************ + [System.Security.SecuritySafeCritical] // auto-generated + public void SetConstant(Object defaultValue) + { + m_containingType.ThrowIfCreated(); + + TypeBuilder.SetConstantValue( + m_moduleBuilder, + m_prToken.Token, + m_returnType, + defaultValue); + } + + + // Return the Token for this property within the TypeBuilder that the + // property is defined within. + public PropertyToken PropertyToken + { + get {return m_prToken;} + } + + internal int MetadataTokenInternal + { + get + { + return m_tkProperty; + } + } + + public override Module Module + { + get + { + return m_containingType.Module; + } + } + + [System.Security.SecurityCritical] // auto-generated + private void SetMethodSemantics(MethodBuilder mdBuilder, MethodSemanticsAttributes semantics) + { + if (mdBuilder == null) + { + throw new ArgumentNullException("mdBuilder"); + } + + m_containingType.ThrowIfCreated(); + TypeBuilder.DefineMethodSemantics( + m_moduleBuilder.GetNativeHandle(), + m_prToken.Token, + semantics, + mdBuilder.GetToken().Token); + } + + [System.Security.SecuritySafeCritical] // auto-generated + public void SetGetMethod(MethodBuilder mdBuilder) + { + SetMethodSemantics(mdBuilder, MethodSemanticsAttributes.Getter); + m_getMethod = mdBuilder; + } + + [System.Security.SecuritySafeCritical] // auto-generated + public void SetSetMethod(MethodBuilder mdBuilder) + { + SetMethodSemantics(mdBuilder, MethodSemanticsAttributes.Setter); + m_setMethod = mdBuilder; + } + + [System.Security.SecuritySafeCritical] // auto-generated + public void AddOtherMethod(MethodBuilder mdBuilder) + { + SetMethodSemantics(mdBuilder, MethodSemanticsAttributes.Other); + } + + // Use this function if client decides to form the custom attribute blob themselves + +#if FEATURE_CORECLR +[System.Security.SecurityCritical] // auto-generated +#else +[System.Security.SecuritySafeCritical] +#endif +[System.Runtime.InteropServices.ComVisible(true)] + public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute) + { + if (con == null) + throw new ArgumentNullException("con"); + if (binaryAttribute == null) + throw new ArgumentNullException("binaryAttribute"); + + m_containingType.ThrowIfCreated(); + TypeBuilder.DefineCustomAttribute( + m_moduleBuilder, + m_prToken.Token, + m_moduleBuilder.GetConstructorToken(con).Token, + binaryAttribute, + false, false); + } + + // Use this function if client wishes to build CustomAttribute using CustomAttributeBuilder + [System.Security.SecuritySafeCritical] // auto-generated + public void SetCustomAttribute(CustomAttributeBuilder customBuilder) + { + if (customBuilder == null) + { + throw new ArgumentNullException("customBuilder"); + } + m_containingType.ThrowIfCreated(); + customBuilder.CreateCustomAttribute(m_moduleBuilder, m_prToken.Token); + } + + // Not supported functions in dynamic module. + public override Object GetValue(Object obj,Object[] index) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); + } + + public override Object GetValue(Object obj,BindingFlags invokeAttr,Binder binder,Object[] index,CultureInfo culture) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); + } + + public override void SetValue(Object obj,Object value,Object[] index) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); + } + + public override void SetValue(Object obj,Object value,BindingFlags invokeAttr,Binder binder,Object[] index,CultureInfo culture) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); + } + + public override MethodInfo[] GetAccessors(bool nonPublic) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); + } + + public override MethodInfo GetGetMethod(bool nonPublic) + { + if (nonPublic || m_getMethod == null) + return m_getMethod; + // now check to see if m_getMethod is public + if ((m_getMethod.Attributes & MethodAttributes.Public) == MethodAttributes.Public) + return m_getMethod; + return null; + } + + public override MethodInfo GetSetMethod(bool nonPublic) + { + if (nonPublic || m_setMethod == null) + return m_setMethod; + // now check to see if m_setMethod is public + if ((m_setMethod.Attributes & MethodAttributes.Public) == MethodAttributes.Public) + return m_setMethod; + return null; + } + + public override ParameterInfo[] GetIndexParameters() + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); + } + + public override Type PropertyType { + get { return m_returnType; } + } + + public override PropertyAttributes Attributes { + get { return m_attributes;} + } + + public override bool CanRead { + get { if (m_getMethod != null) return true; else return false; } } + + public override bool CanWrite { + get { if (m_setMethod != null) return true; else return false; } + } + + public override Object[] GetCustomAttributes(bool inherit) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); + } + + public override Object[] GetCustomAttributes(Type attributeType, bool inherit) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); + } + + public override bool IsDefined (Type attributeType, bool inherit) + { + throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule")); + } + +#if !FEATURE_CORECLR + void _PropertyBuilder.GetTypeInfoCount(out uint pcTInfo) + { + throw new NotImplementedException(); + } + + void _PropertyBuilder.GetTypeInfo(uint iTInfo, uint lcid, IntPtr ppTInfo) + { + throw new NotImplementedException(); + } + + void _PropertyBuilder.GetIDsOfNames([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId) + { + throw new NotImplementedException(); + } + + void _PropertyBuilder.Invoke(uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr) + { + throw new NotImplementedException(); + } +#endif + + public override String Name { + get { return m_name; } + } + + public override Type DeclaringType { + get { return m_containingType; } + } + + public override Type ReflectedType { + get { return m_containingType; } + } + + // These are package private so that TypeBuilder can access them. + private String m_name; // The name of the property + private PropertyToken m_prToken; // The token of this property + private int m_tkProperty; + private ModuleBuilder m_moduleBuilder; + private SignatureHelper m_signature; + private PropertyAttributes m_attributes; // property's attribute flags + private Type m_returnType; // property's return type + private MethodInfo m_getMethod; + private MethodInfo m_setMethod; + private TypeBuilder m_containingType; + } + +} |