From 3df146e198705dee11de890577f004e42126cd70 Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Fri, 8 Jul 2016 18:21:25 +0100 Subject: 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 --- .../Compatibility/TypeExtensionsTest.cs | 21 ++------------------- .../Google.Protobuf/Compatibility/TypeExtensions.cs | 17 ++--------------- csharp/src/Google.Protobuf/FieldCodec.cs | 3 ++- 3 files changed, 6 insertions(+), 35 deletions(-) (limited to 'csharp/src') diff --git a/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs b/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs index 359c72c8..f430b06b 100644 --- a/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs +++ b/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs @@ -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(() => TypeExtensions.GetMethod(type, name)); } -#endif } } +#endif diff --git a/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs b/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs index fe9cda8d..2d93183b 100644 --- a/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs +++ b/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs @@ -33,6 +33,7 @@ using System; using System.Reflection; +#if !DOTNET35 namespace Google.Protobuf.Compatibility { /// @@ -45,20 +46,6 @@ namespace Google.Protobuf.Compatibility /// internal static class TypeExtensions { - /// - /// 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). - /// -#if DOTNET35 - internal static bool IsValueType(this Type target) { - return target.IsValueType; - } -#else - internal static bool IsValueType(this Type target) - { - return target.GetTypeInfo().IsValueType; - } - /// /// See https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom /// @@ -114,6 +101,6 @@ namespace Google.Protobuf.Compatibility } return null; } -#endif } } +#endif diff --git a/csharp/src/Google.Protobuf/FieldCodec.cs b/csharp/src/Google.Protobuf/FieldCodec.cs index 98313088..c28b47e1 100644 --- a/csharp/src/Google.Protobuf/FieldCodec.cs +++ b/csharp/src/Google.Protobuf/FieldCodec.cs @@ -347,7 +347,8 @@ namespace Google.Protobuf public sealed class FieldCodec { 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() { -- cgit v1.2.3