Pārlūkot izejas kodu

Adding conditional compiler symbol to support .NET 3.5 (#1713)

* Adding condition compiler symbol to support .NET 3.5
detlevschwabe 9 gadi atpakaļ
vecāks
revīzija
dc0aeaa903

+ 2 - 1
csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs

@@ -67,7 +67,7 @@ namespace Google.Protobuf.Compatibility
         {
         {
             Assert.AreEqual(expected, TypeExtensions.IsValueType(type));
             Assert.AreEqual(expected, TypeExtensions.IsValueType(type));
         }
         }
-
+#if !DOTNET35
         [Test]
         [Test]
         [TestCase(typeof(object), typeof(string), true)]
         [TestCase(typeof(object), typeof(string), true)]
         [TestCase(typeof(object), typeof(int), true)]
         [TestCase(typeof(object), typeof(int), true)]
@@ -129,5 +129,6 @@ namespace Google.Protobuf.Compatibility
         {
         {
             Assert.Throws<AmbiguousMatchException>(() => TypeExtensions.GetMethod(type, name));
             Assert.Throws<AmbiguousMatchException>(() => TypeExtensions.GetMethod(type, name));
         }
         }
+#endif
     }
     }
 }
 }

+ 8 - 0
csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs

@@ -47,7 +47,11 @@ namespace Google.Protobuf.Compatibility
         /// </summary>
         /// </summary>
         internal static MethodInfo GetGetMethod(this PropertyInfo target)
         internal static MethodInfo GetGetMethod(this PropertyInfo target)
         {
         {
+#if DOTNET35
+            var method = target.GetGetMethod();
+#else
             var method = target.GetMethod;
             var method = target.GetMethod;
+#endif
             return method != null && method.IsPublic ? method : null;
             return method != null && method.IsPublic ? method : null;
         }
         }
 
 
@@ -57,7 +61,11 @@ namespace Google.Protobuf.Compatibility
         /// </summary>
         /// </summary>
         internal static MethodInfo GetSetMethod(this PropertyInfo target)
         internal static MethodInfo GetSetMethod(this PropertyInfo target)
         {
         {
+#if DOTNET35
+            var method = target.GetSetMethod();
+#else
             var method = target.SetMethod;
             var method = target.SetMethod;
+#endif
             return method != null && method.IsPublic ? method : null;
             return method != null && method.IsPublic ? method : null;
         }
         }
     }
     }

+ 6 - 0
csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs

@@ -49,6 +49,11 @@ namespace Google.Protobuf.Compatibility
         /// Returns true if the target type is a value type, including a nullable value type or an enum, or false
         /// 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 it's a reference type (class, delegate, interface - including System.ValueType and System.Enum).
         /// </summary>
         /// </summary>
+#if DOTNET35
+        internal static bool IsValueType(this Type target) {
+            return target.IsValueType;
+        }
+#else
         internal static bool IsValueType(this Type target)
         internal static bool IsValueType(this Type target)
         {
         {
             return target.GetTypeInfo().IsValueType;
             return target.GetTypeInfo().IsValueType;
@@ -109,5 +114,6 @@ namespace Google.Protobuf.Compatibility
             }
             }
             return null;
             return null;
         }
         }
+#endif
     }
     }
 }
 }

+ 11 - 0
csharp/src/Google.Protobuf/JsonFormatter.cs

@@ -885,6 +885,16 @@ namespace Google.Protobuf
                 return originalName;
                 return originalName;
             }
             }
 
 
+#if DOTNET35
+            // TODO: Consider adding functionality to TypeExtensions to avoid this difference.
+            private static Dictionary<object, string> GetNameMapping(System.Type enumType) =>
+                enumType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)
+                    .ToDictionary(f => f.GetValue(null),
+                                  f => (f.GetCustomAttributes(typeof(OriginalNameAttribute), false)
+                                        .FirstOrDefault() as OriginalNameAttribute)
+                                        // If the attribute hasn't been applied, fall back to the name of the field.
+                                        ?.Name ?? f.Name);
+#else
             private static Dictionary<object, string> GetNameMapping(System.Type enumType) =>
             private static Dictionary<object, string> GetNameMapping(System.Type enumType) =>
                 enumType.GetTypeInfo().DeclaredFields
                 enumType.GetTypeInfo().DeclaredFields
                     .Where(f => f.IsStatic)
                     .Where(f => f.IsStatic)
@@ -893,6 +903,7 @@ namespace Google.Protobuf
                                         .FirstOrDefault()
                                         .FirstOrDefault()
                                         // If the attribute hasn't been applied, fall back to the name of the field.
                                         // If the attribute hasn't been applied, fall back to the name of the field.
                                         ?.Name ?? f.Name);
                                         ?.Name ?? f.Name);
+#endif
         }
         }
     }
     }
 }
 }

+ 4 - 0
csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs

@@ -34,6 +34,10 @@ using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Collections.ObjectModel;
 using System.Linq;
 using System.Linq;
+#if DOTNET35
+// Needed for ReadOnlyDictionary, which does not exist in .NET 3.5
+using Google.Protobuf.Collections;
+#endif
 
 
 namespace Google.Protobuf.Reflection
 namespace Google.Protobuf.Reflection
 {
 {

+ 5 - 0
csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs

@@ -59,7 +59,12 @@ namespace Google.Protobuf.WellKnownTypes
             if (firstInvalid == null)
             if (firstInvalid == null)
             {
             {
                 var writer = new StringWriter();
                 var writer = new StringWriter();
+#if DOTNET35
+                var query = paths.Select(JsonFormatter.ToCamelCase);
+                JsonFormatter.WriteString(writer, string.Join(",", query.ToArray()));
+#else
                 JsonFormatter.WriteString(writer, string.Join(",", paths.Select(JsonFormatter.ToCamelCase)));
                 JsonFormatter.WriteString(writer, string.Join(",", paths.Select(JsonFormatter.ToCamelCase)));
+#endif
                 return writer.ToString();
                 return writer.ToString();
             }
             }
             else
             else

+ 0 - 4
csharp/src/Google.Protobuf/WellKnownTypes/TimeExtensions.cs

@@ -31,10 +31,6 @@
 #endregion
 #endregion
 
 
 using System;
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 
 
 namespace Google.Protobuf.WellKnownTypes
 namespace Google.Protobuf.WellKnownTypes
 {
 {