Remove unnecessary reflection call

This is the only call to TypeExtensions.IsValueType, so we can remove
that method, making the whole type conditionally compiled out for .NET 3.5
This commit is contained in:
Jon Skeet 2016-07-08 18:21:25 +01:00
parent 8b00675fc8
commit 3df146e198
3 changed files with 6 additions and 35 deletions

View File

@ -34,6 +34,7 @@ using System;
using System.Collections.Generic;
using System.Reflection;
#if !DOTNET35
namespace Google.Protobuf.Compatibility
{
public class TypeExtensionsTest
@ -50,24 +51,6 @@ namespace Google.Protobuf.Compatibility
{
}
[Test]
[TestCase(typeof(int), true)]
[TestCase(typeof(int?), true)]
[TestCase(typeof(Nullable<>), true)]
[TestCase(typeof(WireFormat.WireType), true)]
[TestCase(typeof(string), false)]
[TestCase(typeof(object), false)]
[TestCase(typeof(Enum), false)]
[TestCase(typeof(ValueType), false)]
[TestCase(typeof(TypeExtensionsTest), false)]
[TestCase(typeof(Action), false)]
[TestCase(typeof(Action<>), false)]
[TestCase(typeof(IDisposable), false)]
public void IsValueType(Type type, bool expected)
{
Assert.AreEqual(expected, TypeExtensions.IsValueType(type));
}
#if !DOTNET35
[Test]
[TestCase(typeof(object), typeof(string), true)]
[TestCase(typeof(object), typeof(int), true)]
@ -129,6 +112,6 @@ namespace Google.Protobuf.Compatibility
{
Assert.Throws<AmbiguousMatchException>(() => TypeExtensions.GetMethod(type, name));
}
#endif
}
}
#endif

View File

@ -33,6 +33,7 @@
using System;
using System.Reflection;
#if !DOTNET35
namespace Google.Protobuf.Compatibility
{
/// <summary>
@ -45,20 +46,6 @@ namespace Google.Protobuf.Compatibility
/// </summary>
internal static class TypeExtensions
{
/// <summary>
/// Returns true if the target type is a value type, including a nullable value type or an enum, or false
/// if it's a reference type (class, delegate, interface - including System.ValueType and System.Enum).
/// </summary>
#if DOTNET35
internal static bool IsValueType(this Type target) {
return target.IsValueType;
}
#else
internal static bool IsValueType(this Type target)
{
return target.GetTypeInfo().IsValueType;
}
/// <summary>
/// See https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom
/// </summary>
@ -114,6 +101,6 @@ namespace Google.Protobuf.Compatibility
}
return null;
}
#endif
}
}
#endif

View File

@ -347,7 +347,8 @@ namespace Google.Protobuf
public sealed class FieldCodec<T>
{
private static readonly T DefaultDefault;
private static readonly bool TypeSupportsPacking = typeof(T).IsValueType() && Nullable.GetUnderlyingType(typeof(T)) == null;
// Only non-nullable value types support packing. This is the simplest way of detecting that.
private static readonly bool TypeSupportsPacking = default(T) != null;
static FieldCodec()
{