Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/System.Private.CoreLib/shared/System/ComponentModel/DefaultValueAttribute.cs')
-rw-r--r--src/System.Private.CoreLib/shared/System/ComponentModel/DefaultValueAttribute.cs36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/System.Private.CoreLib/shared/System/ComponentModel/DefaultValueAttribute.cs b/src/System.Private.CoreLib/shared/System/ComponentModel/DefaultValueAttribute.cs
index 3cdc90729..5f7108a52 100644
--- a/src/System.Private.CoreLib/shared/System/ComponentModel/DefaultValueAttribute.cs
+++ b/src/System.Private.CoreLib/shared/System/ComponentModel/DefaultValueAttribute.cs
@@ -2,11 +2,8 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System;
-using System.ComponentModel;
-using System.Diagnostics;
using System.Globalization;
-using System.Runtime.InteropServices;
+using System.Threading;
namespace System.ComponentModel
{
@@ -23,6 +20,9 @@ namespace System.ComponentModel
/// </devdoc>
private object _value;
+ // Delegate ad hoc created 'TypeDescriptor.ConvertFromInvariantString' reflection object cache
+ static object s_convertFromInvariantString;
+
/// <devdoc>
/// <para>Initializes a new instance of the <see cref='System.ComponentModel.DefaultValueAttribute'/> class, converting the
/// specified value to the
@@ -36,7 +36,11 @@ namespace System.ComponentModel
// load an otherwise normal class.
try
{
- if (type.IsSubclassOf(typeof(Enum)))
+ if (TryConvertFromInvariantString(type, value, out object convertedValue))
+ {
+ _value = convertedValue;
+ }
+ else if (type.IsSubclassOf(typeof(Enum)))
{
_value = Enum.Parse(type, value, true);
}
@@ -48,6 +52,28 @@ namespace System.ComponentModel
{
_value = Convert.ChangeType(value, type, CultureInfo.InvariantCulture);
}
+
+ return;
+
+ // Looking for ad hoc created TypeDescriptor.ConvertFromInvariantString(Type, string)
+ bool TryConvertFromInvariantString(Type typeToConvert, string stringValue, out object conversionResult)
+ {
+ conversionResult = null;
+
+ // lazy init reflection objects
+ if (s_convertFromInvariantString == null)
+ {
+ Type typeDescriptorType = Type.GetType("System.ComponentModel.TypeDescriptor, System.ComponentModel.TypeConverter", throwOnError: false);
+ Volatile.Write(ref s_convertFromInvariantString, typeDescriptorType == null ? new object() : Delegate.CreateDelegate(typeof(Func<Type, string, object>), typeDescriptorType, "ConvertFromInvariantString", ignoreCase: false));
+ }
+
+ if (!(s_convertFromInvariantString is Func<Type, string, object> convertFromInvariantString))
+ return false;
+
+ conversionResult = convertFromInvariantString(typeToConvert, stringValue);
+
+ return true;
+ }
}
catch
{