Virtual AttributeType property and signature generic types (#19818)

* Virtual AttributeType property and signature generic types

https://github.com/dotnet/corefx/issues/31614

1. This will allow Reflection providers the option
to supply the attribute type without building
an entire constructor.

https://github.com/dotnet/corefx/issues/31798

2. This will permit other Reflection providers
to support Type.MakeGenericMethodParameter()
in their implementations.

* More robust argument validation.

* Change parameter name

Signed-off-by: dotnet-bot <dotnet-bot@microsoft.com>
This commit is contained in:
Atsushi Kanamori 2018-09-04 11:24:00 -07:00
Родитель 60a9b7c8c4
Коммит bdd0b15d92
2 изменённых файлов: 19 добавлений и 3 удалений

Просмотреть файл

@ -10,11 +10,25 @@ namespace System.Reflection
{
internal sealed class SignatureConstructedGenericType : SignatureType
{
internal SignatureConstructedGenericType(Type genericTypeDefinition, Type[] genericTypeArguments)
// The exception-visible name "typeArguments" is chosen to match the parameter name to Type.MakeGenericType() since that's the
// intended user of this constructor.
internal SignatureConstructedGenericType(Type genericTypeDefinition, Type[] typeArguments)
{
Debug.Assert(genericTypeDefinition != null && genericTypeArguments != null);
if (genericTypeDefinition == null)
throw new ArgumentNullException(nameof(genericTypeDefinition));
if (typeArguments == null)
throw new ArgumentNullException(nameof(typeArguments));
typeArguments = (Type[])(typeArguments.Clone());
for (int i = 0; i < typeArguments.Length; i++)
{
if (typeArguments[i] == null)
throw new ArgumentNullException(nameof(typeArguments));
}
_genericTypeDefinition = genericTypeDefinition;
_genericTypeArguments = (Type[])(genericTypeArguments.Clone());
_genericTypeArguments = typeArguments;
}
public sealed override bool IsTypeDefinition => false;

Просмотреть файл

@ -346,6 +346,8 @@ namespace System
public virtual Type MakeGenericType(params Type[] typeArguments) { throw new NotSupportedException(SR.NotSupported_SubclassOverride); }
public virtual Type MakePointerType() { throw new NotSupportedException(); }
public static Type MakeGenericSignatureType(Type genericTypeDefinition, params Type[] typeArguments) => new SignatureConstructedGenericType(genericTypeDefinition, typeArguments);
public static Type MakeGenericMethodParameter(int position)
{
if (position < 0)