return outHandles;
}
- internal static object CreateInstanceForAnotherGenericParameter([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.NonPublicConstructors)] RuntimeType type, RuntimeType genericParameter)
+ internal static object CreateInstanceForAnotherGenericParameter(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] RuntimeType type,
+ RuntimeType genericParameter)
{
+ Debug.Assert(type.GetConstructor(Type.EmptyTypes) is ConstructorInfo c && c.IsPublic,
+ $"CreateInstanceForAnotherGenericParameter requires {nameof(type)} to have a public parameterless constructor so it can be annotated for trimming without preserving private constructors.");
+
object? instantiatedObject = null;
IntPtr typeHandle = genericParameter.GetTypeHandleInternal().Value;
return instantiatedObject!;
}
- internal static object CreateInstanceForAnotherGenericParameter([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.NonPublicConstructors)] RuntimeType type, RuntimeType genericParameter1, RuntimeType genericParameter2)
+ internal static object CreateInstanceForAnotherGenericParameter(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] RuntimeType type,
+ RuntimeType genericParameter1,
+ RuntimeType genericParameter2)
{
+ Debug.Assert(type.GetConstructor(Type.EmptyTypes) is ConstructorInfo c && c.IsPublic,
+ $"CreateInstanceForAnotherGenericParameter requires {nameof(type)} to have a public parameterless constructor so it can be annotated for trimming without preserving private constructors.");
+
object? instantiatedObject = null;
IntPtr* pTypeHandles = stackalloc IntPtr[]
[Serializable]
internal sealed partial class EnumComparer<T> : Comparer<T>, ISerializable where T : struct, Enum
{
- internal EnumComparer() { }
+ public EnumComparer() { }
// Used by the serialization engine.
private EnumComparer(SerializationInfo info, StreamingContext context) { }
// Needs to be public to support binary serialization compatibility
public sealed partial class EnumEqualityComparer<T> : EqualityComparer<T>, ISerializable where T : struct, Enum
{
- internal EnumEqualityComparer() { }
+ public EnumEqualityComparer() { }
// This is used by the serialization engine.
private EnumEqualityComparer(SerializationInfo information, StreamingContext context) { }
return constraints ?? Type.EmptyTypes;
}
- internal static object CreateInstanceForAnotherGenericParameter([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type genericType, RuntimeType genericArgument)
+ internal static object CreateInstanceForAnotherGenericParameter(
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type genericType,
+ RuntimeType genericArgument)
{
var gt = (RuntimeType)MakeGenericType(genericType, new Type[] { genericArgument });
RuntimeConstructorInfo? ctor = gt.GetDefaultConstructor();
- if (ctor is null)
+
+ // CreateInstanceForAnotherGenericParameter requires type to have a public parameterless constructor so it can be annotated for trimming without preserving private constructors.
+ if (ctor is null || !ctor.IsPublic)
throw new MissingMethodException(SR.Format(SR.Arg_NoDefCTor, gt));
return ctor.InternalInvoke(null, null, wrapExceptions: true)!;