using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Collections.ObjectModel;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public abstract class Card
public int Index { get; private set; }
public string Front { get; private set; }
public string Back { get; private set; }
public Card(int index, string front, string back)
public class FearCard : Card
public FearCard(int index, string front, string back) : base(index, front, back) { }
public class EventCard : Card
public EventCard(int index, string front, string back) : base(index, front, back) { }
public class InvaderCard : Card
public InvaderCard(int index, string front, string back) : base(index, front, back) { }
public class BlightCard : Card
public BlightCard(int index, string front, string back) : base(index, front, back) { }
internal static class CardExtensions
public static T CreateCard<T>(int index, string front, string back) where T : Card
return (T)Activator.CreateInstance(typeof(T), index, front, back);
internal static class MyExtensions
public static T CreateDeck<T>(this ObservableCollection<T> deck, int index, string front, string back) where T : Card
throw new ArgumentNullException();
var card = CardExtensions.CreateCard<T>(index, front, back);
public static void Test()
var query = typeof(Card).Assembly.GetTypes()
.Where(t => !t.IsAbstract && typeof(Card).IsAssignableFrom(t));
foreach (var type in query)
typeof(TestClass).GetMethod("GenericTest", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public).MakeGenericMethod(new[] { type }).Invoke(null, null);
static void GenericTest<T>() where T : Card
var deck = new ObservableCollection<T>();
var card = deck.CreateDeck(0, "yes", "no");
Console.WriteLine("Created deck of {0}", typeof(T));
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(deck));
public class FlarbCard : Card
public FlarbCard(int index, string front, string back) : base(index, front, back) { }
public string SomeOtherProperty = "some other property value";
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
public static void IsTrue(bool value, string message)
throw new AssertionFailedException(message ?? "failed");