Avoid NullReferenceException when accessing CustomOptions Even though the property is deprecated, it still shouldn't throw.
diff --git a/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs b/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs index 02fe778..d65a6f2 100644 --- a/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs +++ b/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs
@@ -41,6 +41,7 @@ using static UnitTest.Issues.TestProtos.ComplexOptionType2.Types; using static UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Extensions; using static UnitTest.Issues.TestProtos.DummyMessageContainingEnum.Types; +using Google.Protobuf.TestProtos; #pragma warning disable CS0618 @@ -177,6 +178,21 @@ AssertOption(new Aggregate { S = "FieldAnnotation" }, fieldOptions.TryGetMessage, Fieldopt, AggregateMessage.Descriptor.Fields["fieldname"].GetOption); } + [Test] + public void NoOptions() + { + var fileDescriptor = UnittestProto3Reflection.Descriptor; + var messageDescriptor = TestAllTypes.Descriptor; + Assert.NotNull(fileDescriptor.CustomOptions); + Assert.NotNull(messageDescriptor.CustomOptions); + Assert.NotNull(messageDescriptor.Fields[1].CustomOptions); + Assert.NotNull(fileDescriptor.Services[0].CustomOptions); + Assert.NotNull(fileDescriptor.Services[0].Methods[0].CustomOptions); + Assert.NotNull(fileDescriptor.EnumTypes[0].CustomOptions); + Assert.NotNull(fileDescriptor.EnumTypes[0].Values[0].CustomOptions); + Assert.NotNull(TestAllTypes.Descriptor.Oneofs[0].CustomOptions); + } + private void AssertOption<T, D>(T expected, OptionFetcher<T> fetcher, Extension<D, T> extension, Func<Extension<D, T>, T> descriptorOptionFetcher) where D : IExtendableMessage<D> { T customOptionsValue;
diff --git a/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs index 33be961..264a88a 100644 --- a/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs +++ b/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs
@@ -129,7 +129,7 @@ /// The (possibly empty) set of custom options for this enum. /// </summary> [Obsolete("CustomOptions are obsolete. Use GetOption")] - public CustomOptions CustomOptions => new CustomOptions(Proto.Options._extensions?.ValuesByNumber); + public CustomOptions CustomOptions => new CustomOptions(Proto.Options?._extensions?.ValuesByNumber); /// <summary> /// Gets a single value enum option for this descriptor
diff --git a/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs index a476ef1..3933820 100644 --- a/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs +++ b/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs
@@ -74,7 +74,7 @@ /// The (possibly empty) set of custom options for this enum value. /// </summary> [Obsolete("CustomOptions are obsolete. Use GetOption")] - public CustomOptions CustomOptions => new CustomOptions(Proto.Options._extensions?.ValuesByNumber); + public CustomOptions CustomOptions => new CustomOptions(Proto.Options?._extensions?.ValuesByNumber); /// <summary> /// Gets a single value enum value option for this descriptor
diff --git a/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs index a81bc9c..ddd671a 100644 --- a/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs +++ b/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
@@ -299,7 +299,7 @@ /// The (possibly empty) set of custom options for this field. /// </summary> [Obsolete("CustomOptions are obsolete. Use GetOption")] - public CustomOptions CustomOptions => new CustomOptions(Proto.Options._extensions?.ValuesByNumber); + public CustomOptions CustomOptions => new CustomOptions(Proto.Options?._extensions?.ValuesByNumber); /// <summary> /// Gets a single value field option for this descriptor
diff --git a/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs index 83849a2..dbb6b15 100644 --- a/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs +++ b/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs
@@ -542,7 +542,7 @@ /// The (possibly empty) set of custom options for this file. /// </summary> [Obsolete("CustomOptions are obsolete. Use GetOption")] - public CustomOptions CustomOptions => new CustomOptions(Proto.Options._extensions?.ValuesByNumber); + public CustomOptions CustomOptions => new CustomOptions(Proto.Options?._extensions?.ValuesByNumber); /// <summary> /// Gets a single value file option for this descriptor
diff --git a/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs index 944f6e8..e278514 100644 --- a/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs +++ b/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
@@ -261,7 +261,7 @@ /// The (possibly empty) set of custom options for this message. /// </summary> [Obsolete("CustomOptions are obsolete. Use GetOption")] - public CustomOptions CustomOptions => new CustomOptions(Proto.Options._extensions?.ValuesByNumber); + public CustomOptions CustomOptions => new CustomOptions(Proto.Options?._extensions?.ValuesByNumber); /// <summary> /// Gets a single value message option for this descriptor
diff --git a/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs index 13d2396..92250ba 100644 --- a/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs +++ b/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs
@@ -74,7 +74,7 @@ /// The (possibly empty) set of custom options for this method. /// </summary> [Obsolete("CustomOptions are obsolete. Use GetOption")] - public CustomOptions CustomOptions => new CustomOptions(Proto.Options._extensions?.ValuesByNumber); + public CustomOptions CustomOptions => new CustomOptions(Proto.Options?._extensions?.ValuesByNumber); /// <summary> /// Gets a single value method option for this descriptor
diff --git a/csharp/src/Google.Protobuf/Reflection/OneofDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/OneofDescriptor.cs index 655c07e..1e30b92 100644 --- a/csharp/src/Google.Protobuf/Reflection/OneofDescriptor.cs +++ b/csharp/src/Google.Protobuf/Reflection/OneofDescriptor.cs
@@ -106,7 +106,7 @@ /// The (possibly empty) set of custom options for this oneof. /// </summary> [Obsolete("CustomOptions are obsolete. Use GetOption")] - public CustomOptions CustomOptions => new CustomOptions(proto.Options._extensions?.ValuesByNumber); + public CustomOptions CustomOptions => new CustomOptions(proto.Options?._extensions?.ValuesByNumber); /// <summary> /// Gets a single value oneof option for this descriptor
diff --git a/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs index 120c6c6..ba310ad 100644 --- a/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs +++ b/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs
@@ -95,7 +95,7 @@ /// The (possibly empty) set of custom options for this service. /// </summary> [Obsolete("CustomOptions are obsolete. Use GetOption")] - public CustomOptions CustomOptions => new CustomOptions(Proto.Options._extensions?.ValuesByNumber); + public CustomOptions CustomOptions => new CustomOptions(Proto.Options?._extensions?.ValuesByNumber); /// <summary> /// Gets a single value service option for this descriptor