当前位置: 首页>>代码示例>>C#>>正文


C# Microsoft.Cci.Constructor方法代码示例

本文整理汇总了C#中Microsoft.Cci.Constructor方法的典型用法代码示例。如果您正苦于以下问题:C# Microsoft.Cci.Constructor方法的具体用法?C# Microsoft.Cci.Constructor怎么用?C# Microsoft.Cci.Constructor使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Microsoft.Cci的用法示例。


在下文中一共展示了Microsoft.Cci.Constructor方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: CreateCustomAttributeBuilder

        private CustomAttributeBuilder CreateCustomAttributeBuilder(Cci.ICustomAttribute attribute)
        {
            // TODO (tomat): Use CCI to build the blob?
            // TODO (tomat): The CustomAttributeBuilder has problems with application of an attribute on itself 
            // and other dependencies on unbaked types.
            // e.g. [My]class MyAttribute : Attribute { }

            var ctor = ResolveConstructor(attribute.Constructor(_context));
            var attributeType = ctor.DeclaringType;

            object[] argValues = new object[attribute.ArgumentCount];
            ArrayBuilder<object> propertyValues = null;
            ArrayBuilder<object> fieldValues = null;
            ArrayBuilder<FieldInfo> fields = null;
            ArrayBuilder<PropertyInfo> properties = null;
            try
            {
                int i = 0;
                foreach (Cci.IMetadataExpression arg in attribute.GetArguments(_context))
                {
                    argValues[i++] = GetMetadataExpressionValue(arg);
                }

                foreach (Cci.IMetadataNamedArgument namedArg in attribute.GetNamedArguments(_context))
                {
                    object value = GetMetadataExpressionValue(namedArg.ArgumentValue);
                    string name = namedArg.ArgumentName;

                    Type type = ResolveType(namedArg.Type);

                    if (namedArg.IsField)
                    {
                        if (fields == null)
                        {
                            fields = ArrayBuilder<FieldInfo>.GetInstance();
                            fieldValues = ArrayBuilder<object>.GetInstance();
                        }

                        var field = new FieldRef(attributeType, name, type);
                        fields.Add(field);
                        fieldValues.Add(value);
                    }
                    else
                    {
                        if (properties == null)
                        {
                            properties = ArrayBuilder<PropertyInfo>.GetInstance();
                            propertyValues = ArrayBuilder<object>.GetInstance();
                        }

                        var property = new CustomAttributeProperty(attributeType, name, type);
                        properties.Add(property);
                        propertyValues.Add(value);
                    }
                }

                try
                {
                    return new CustomAttributeBuilder(
                        ctor as ConstructorInfo ?? new ConstructorRef(ctor),
                        argValues,
                        (properties != null) ? properties.ToArray() : SpecializedCollections.EmptyArray<PropertyInfo>(),
                        (properties != null) ? propertyValues.ToArray() : SpecializedCollections.EmptyArray<object>(),
                        (fields != null) ? fields.ToArray() : SpecializedCollections.EmptyArray<FieldInfo>(),
                        (fields != null) ? fieldValues.ToArray() : SpecializedCollections.EmptyArray<object>());
                }
                catch (ArgumentException)
                {
                    throw new NotSupportedException("Ref.Emit limitation");
                }
            }
            finally
            {
                if (properties != null)
                {
                    properties.Free();
                    propertyValues.Free();
                }

                if (fields != null)
                {
                    fields.Free();
                    fieldValues.Free();
                }
            }
        }
开发者ID:furesoft,项目名称:roslyn,代码行数:86,代码来源:ReflectionEmitter.cs


注:本文中的Microsoft.Cci.Constructor方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。