Skip to content

Instantly share code, notes, and snippets.

@Sathyaish
Last active August 29, 2015 14:26
Show Gist options
  • Save Sathyaish/8cb44bd7984435776070 to your computer and use it in GitHub Desktop.
Save Sathyaish/8cb44bd7984435776070 to your computer and use it in GitHub Desktop.
using System;
using System.Linq;
using System.Reflection;
namespace NullObjectDesignPattern
{
class Program
{
static void Main(string[] args)
{
// parameterless -- falls back to default dog
var dogFactory = new Factory<Dog>(new Dog { Name = "Tommy" });
var dog1 = dogFactory.Create("Bruno");
Console.WriteLine(dog1.Name);
// parameterless -- overrides default dog
var dog2 = dogFactory.Create();
Console.WriteLine(dog2.Name);
// parameterless -- falls back to default Cat
var catFactory = new Factory<Cat>(new Cat("Lisa"));
var cat1 = catFactory.Create();
Console.WriteLine(cat1.Name);
// parameterized -- overrides default Cat
var cat2 = catFactory.Create("Polly");
Console.WriteLine(cat2.Name);
Console.ReadKey();
}
}
class Factory<T> where T: class
{
private T _defaultValue = default(T);
public Factory(T defaultValue = default(T))
{
_defaultValue = defaultValue;
}
public T Create(params object[] args)
{
return TryCreate(args) ?? _defaultValue;
}
protected virtual T TryCreate(params object[] args)
{
var matchingCtor = (from ctor in typeof(T).GetConstructors()
let parameters = ctor.GetParameters()
let i = 0
where parameters.Length == args.Length
where parameters.AndArgumentTypesAreSame(args)
select ctor).FirstOrDefault();
if (matchingCtor == null) return null;
return matchingCtor.Invoke(args) as T;
}
}
public static class Extensions
{
public static bool AndArgumentTypesAreSame(this ParameterInfo[] parameterInfoArray, object[] argumentArray)
{
if (parameterInfoArray != null && argumentArray != null && parameterInfoArray.Length == argumentArray.Length)
{
for(int i = 0; i < parameterInfoArray.Length; i++)
{
if (parameterInfoArray[i].ParameterType != argumentArray[i].GetType())
return false;
}
return true;
}
return false;
}
}
class Dog
{
public string Name { get; set; } = "Woofy";
}
class Cat
{
public string Name { get; set; }
public Cat(string name)
{
Name = name;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment