Skip to content

Commit

Permalink
Updated ObjectFactory implementation to use Expression with memoizati…
Browse files Browse the repository at this point in the history
…on to create new object instead of Activator.
  • Loading branch information
oskardudycz committed Oct 8, 2022
1 parent d5806e7 commit e34e562
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 32 deletions.
55 changes: 24 additions & 31 deletions src/Ogooreck/Factories/ObjectFactory.cs
Original file line number Diff line number Diff line change
@@ -1,40 +1,33 @@
using System.Runtime.CompilerServices;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.Serialization;

#pragma warning disable CS1591

namespace Ogooreck.Factories;

/// <summary>
/// Wraps objects creation
/// </summary>
/// <typeparam name="T"></typeparam>
public static class ObjectFactory<T>
{
/// <summary>
/// Creates empty unitialised instance of object T
/// </summary>
/// <returns></returns>
public static T GetUnitialized() =>
(T)RuntimeHelpers.GetUninitializedObject(typeof(T));
public static readonly Func<T> GetDefaultOrUninitialized = Creator();

/// <summary>
/// Creates empty unitialised instance of object T
/// </summary>
/// <returns></returns>
public static T? GetDefault()
private static Func<T> Creator()
{
try
{
return (T?)Activator.CreateInstance(typeof(T), true);
}
catch (MissingMethodException? e)
{
Console.WriteLine(e);
return default;
}
var t = typeof(T);
if (t == typeof(string))
return Expression.Lambda<Func<T>>(Expression.Constant(string.Empty)).Compile();

if (t.HasDefaultConstructor())
return Expression.Lambda<Func<T>>(Expression.New(t)).Compile();

return () => (T)FormatterServices.GetUninitializedObject(t);
}
}

/// <summary>
/// Creates empty unitialised instance of object T
/// </summary>
/// <returns></returns>
public static T GetDefaultOrUninitialized()
=> GetDefault() ?? GetUnitialized();
public static class ObjectFactory
{
public static bool HasDefaultConstructor(this Type t)
{
return t.IsValueType || t.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null, Type.EmptyTypes, null) != null;
}
}
2 changes: 1 addition & 1 deletion src/Ogooreck/Ogooreck.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<VersionPrefix>0.5.0</VersionPrefix>
<VersionPrefix>0.5.1</VersionPrefix>
<TargetFramework>net6.0</TargetFramework>
<GenerateAssemblyTitleAttribute>true</GenerateAssemblyTitleAttribute>
<GenerateAssemblyDescriptionAttribute>true</GenerateAssemblyDescriptionAttribute>
Expand Down

0 comments on commit e34e562

Please sign in to comment.