Object - ToOrDefault
An object extension method that converts this object to a specified or default object.
public static void Main() { object val1 = 123; object val2 = "1033.67"; object date = "06 July 2008 7:32:47 AM"; object str = "A100"; string format = "{0, -30} {1, -15} {2, -15}"; Console.WriteLine(format, "Object", "To", "Value"); Console.WriteLine(format, "------", "--", "-----"); // C# Extension Method: Object - ToOrDefault var result1 = val1.ToOrDefault<int>(); var result2 = val2.ToOrDefault<double>(); var result3 = date.ToOrDefault<DateTime>(); var result4 = str.ToOrDefault<string>(); var result5 = str.ToOrDefault<int>(0); Console.WriteLine(format, val1, result1.GetTypeCode(), result1); Console.WriteLine(format, val2, result2.GetTypeCode(), result2); Console.WriteLine(format, date, result3.GetTypeCode(), result3); Console.WriteLine(format, str, result4.GetTypeCode(), result4); Console.WriteLine(format, str, result5.GetTypeCode(), result5); }
View Source
using System; using System.ComponentModel; public static partial class Extensions { /// <summary> /// A System.Object extension method that converts this object to an or default. /// </summary> /// <typeparam name="T">Generic type parameter.</typeparam> /// <param name="this">this.</param> /// <param name="defaultValueFactory">The default value factory.</param> /// <returns>The given data converted to a T.</returns> /// <example> /// <code> /// using Microsoft.VisualStudio.TestTools.UnitTesting; /// using Z.ExtensionMethods.Object; /// /// namespace ExtensionMethods.Examples /// { /// [TestClass] /// public class System_Object_ToOrDefault /// { /// [TestMethod] /// public void ToOrDefault() /// { /// // Type /// object intValue = "1"; /// object invalidValue = "Fizz"; /// /// // Exemples /// var result1 = intValue.ToOrDefault<int>(); // return 1; /// var result2 = invalidValue.ToOrDefault<int>(); // return 0; /// int result3 = invalidValue.ToOrDefault(3); // return 3; /// int result4 = invalidValue.ToOrDefault(() => 4); // return 4; /// /// // Unit Test /// Assert.AreEqual(1, result1); /// Assert.AreEqual(0, result2); /// Assert.AreEqual(3, result3); /// Assert.AreEqual(4, result4); /// } /// } /// } /// </code> /// </example> /// <example> /// <code> /// using Microsoft.VisualStudio.TestTools.UnitTesting; /// using Z.ExtensionMethods.Object; /// /// namespace ExtensionMethods.Examples /// { /// [TestClass] /// public class System_Object_ToOrDefault /// { /// [TestMethod] /// public void ToOrDefault() /// { /// // Type /// object intValue = "1"; /// object invalidValue = "Fizz"; /// /// // Exemples /// var result1 = intValue.ToOrDefault<int>(); // return 1; /// var result2 = invalidValue.ToOrDefault<int>(); // return 0; /// int result3 = invalidValue.ToOrDefault(3); // return 3; /// int result4 = invalidValue.ToOrDefault(() => 4); // return 4; /// /// // Unit Test /// Assert.AreEqual(1, result1); /// Assert.AreEqual(0, result2); /// Assert.AreEqual(3, result3); /// Assert.AreEqual(4, result4); /// } /// } /// } /// </code> /// </example> /// <example> /// <code> /// using Microsoft.VisualStudio.TestTools.UnitTesting; /// using Z.ExtensionMethods.Object; /// /// namespace ExtensionMethods.Examples /// { /// [TestClass] /// public class System_Object_ToOrDefault /// { /// [TestMethod] /// public void ToOrDefault() /// { /// // Type /// object intValue = "1"; /// object invalidValue = "Fizz"; /// /// // Exemples /// var result1 = intValue.ToOrDefault<int>(); // return 1; /// var result2 = invalidValue.ToOrDefault<int>(); // return 0; /// int result3 = invalidValue.ToOrDefault(3); // return 3; /// int result4 = invalidValue.ToOrDefault(() => 4); // return 4; /// /// // Unit Test /// Assert.AreEqual(1, result1); /// Assert.AreEqual(0, result2); /// Assert.AreEqual(3, result3); /// Assert.AreEqual(4, result4); /// } /// } /// } /// </code> /// </example> public static T ToOrDefault<T>(this Object @this, Func<object, T> defaultValueFactory) { try { if (@this != null) { Type targetType = typeof (T); if (@this.GetType() == targetType) { return (T) @this; } TypeConverter converter = TypeDescriptor.GetConverter(@this); if (converter != null) { if (converter.CanConvertTo(targetType)) { return (T) converter.ConvertTo(@this, targetType); } } converter = TypeDescriptor.GetConverter(targetType); if (converter != null) { if (converter.CanConvertFrom(@this.GetType())) { return (T) converter.ConvertFrom(@this); } } if (@this == DBNull.Value) { return (T) (object) null; } } return (T) @this; } catch (Exception) { return defaultValueFactory(@this); } } /// <summary> /// A System.Object extension method that converts this object to an or default. /// </summary> /// <typeparam name="T">Generic type parameter.</typeparam> /// <param name="this">this.</param> /// <param name="defaultValueFactory">The default value factory.</param> /// <returns>The given data converted to a T.</returns> /// <example> /// <code> /// using Microsoft.VisualStudio.TestTools.UnitTesting; /// using Z.ExtensionMethods.Object; /// /// namespace ExtensionMethods.Examples /// { /// [TestClass] /// public class System_Object_ToOrDefault /// { /// [TestMethod] /// public void ToOrDefault() /// { /// // Type /// object intValue = "1"; /// object invalidValue = "Fizz"; /// /// // Exemples /// var result1 = intValue.ToOrDefault<int>(); // return 1; /// var result2 = invalidValue.ToOrDefault<int>(); // return 0; /// int result3 = invalidValue.ToOrDefault(3); // return 3; /// int result4 = invalidValue.ToOrDefault(() => 4); // return 4; /// /// // Unit Test /// Assert.AreEqual(1, result1); /// Assert.AreEqual(0, result2); /// Assert.AreEqual(3, result3); /// Assert.AreEqual(4, result4); /// } /// } /// } /// </code> /// </example> /// <example> /// <code> /// using Microsoft.VisualStudio.TestTools.UnitTesting; /// using Z.ExtensionMethods.Object; /// /// namespace ExtensionMethods.Examples /// { /// [TestClass] /// public class System_Object_ToOrDefault /// { /// [TestMethod] /// public void ToOrDefault() /// { /// // Type /// object intValue = "1"; /// object invalidValue = "Fizz"; /// /// // Exemples /// var result1 = intValue.ToOrDefault<int>(); // return 1; /// var result2 = invalidValue.ToOrDefault<int>(); // return 0; /// int result3 = invalidValue.ToOrDefault(3); // return 3; /// int result4 = invalidValue.ToOrDefault(() => 4); // return 4; /// /// // Unit Test /// Assert.AreEqual(1, result1); /// Assert.AreEqual(0, result2); /// Assert.AreEqual(3, result3); /// Assert.AreEqual(4, result4); /// } /// } /// } /// </code> /// </example> /// <example> /// <code> /// using Microsoft.VisualStudio.TestTools.UnitTesting; /// using Z.ExtensionMethods.Object; /// /// namespace ExtensionMethods.Examples /// { /// [TestClass] /// public class System_Object_ToOrDefault /// { /// [TestMethod] /// public void ToOrDefault() /// { /// // Type /// object intValue = "1"; /// object invalidValue = "Fizz"; /// /// // Exemples /// var result1 = intValue.ToOrDefault<int>(); // return 1; /// var result2 = invalidValue.ToOrDefault<int>(); // return 0; /// int result3 = invalidValue.ToOrDefault(3); // return 3; /// int result4 = invalidValue.ToOrDefault(() => 4); // return 4; /// /// // Unit Test /// Assert.AreEqual(1, result1); /// Assert.AreEqual(0, result2); /// Assert.AreEqual(3, result3); /// Assert.AreEqual(4, result4); /// } /// } /// } /// </code> /// </example> public static T ToOrDefault<T>(this Object @this, Func<T> defaultValueFactory) { return @this.ToOrDefault(x => defaultValueFactory()); } /// <summary> /// A System.Object extension method that converts this object to an or default. /// </summary> /// <typeparam name="T">Generic type parameter.</typeparam> /// <param name="this">this.</param> /// <returns>The given data converted to a T.</returns> public static T ToOrDefault<T>(this Object @this) { return @this.ToOrDefault(x => default(T)); } /// <summary> /// A System.Object extension method that converts this object to an or default. /// </summary> /// <typeparam name="T">Generic type parameter.</typeparam> /// <param name="this">this.</param> /// <param name="defaultValue">The default value.</param> /// <returns>The given data converted to a T.</returns> public static T ToOrDefault<T>(this Object @this, T defaultValue) { return @this.ToOrDefault(x => defaultValue); } }