private bool CheckParameter(ParameterDefinition paramDef) { CustomAttribute dynamicAttribute; if(!paramDef.TryGetDynamicAttribute(out dynamicAttribute)) { return false; } bool[] dynamicPositioningFlags = DynamicHelper.GetDynamicPositioningFlags(dynamicAttribute); if(dynamicPositioningFlags.Length != this.dynamicPositioningFlags.Count) { return false; } LinkedListNode<bool> currentNode = this.dynamicPositioningFlags.First; foreach (bool flag in dynamicPositioningFlags) { if(flag != currentNode.Value) { return false; } currentNode = currentNode.Next; } return true; }
protected override void DoWriteParameterTypeAndName(TypeReference type, string name, ParameterDefinition reference) { if (!Language.IsValidIdentifier(name)) { name = Language.ReplaceInvalidCharactersInIdentifier(name); } if (reference.IsParamArray()) { WriteKeyword(KeyWordWriter.ParamArray); WriteSpace(); } CustomAttribute dynamicAttribute; if (reference.TryGetDynamicAttribute(out dynamicAttribute)) { IEnumerator positioningFlagsEnumerator = DynamicHelper.GetDynamicPositioningFlags(dynamicAttribute).GetEnumerator(); if (reference.ParameterType.IsByReference && (reference.ParameterType as ByReferenceType).ElementType == type) { if (!positioningFlagsEnumerator.MoveNext() || (bool)positioningFlagsEnumerator.Current) { throw new Exception("Invalid argument type for DynamicAttribute"); } } WriteDynamicType(type, positioningFlagsEnumerator); WriteSpace(); } else { // undocumented C# keyword like __arglist if (!string.IsNullOrEmpty(ToTypeString(type))) { WriteReferenceAndNamespaceIfInCollision(type); WriteSpace(); } } if (Language.IsGlobalKeyword(name)) { name = Utilities.EscapeName(name, this.Language); } Write(name); }