public static SpellInfo CreateInstancedSpellInfo(SpellInfo info) { if (info == null) return null; SpellInfo newSpellInstance = new SpellInfo(); var type = typeof(SpellInfo); foreach (var sourceProperty in type.GetProperties().ToList()) { var targetProperty = type.GetProperty(sourceProperty.Name); targetProperty.SetValue(newSpellInstance, sourceProperty.GetValue(info, null), null); } foreach (var sourceField in type.GetFields().ToList()) { try { var targetField = type.GetField(sourceField.Name); targetField.SetValue(newSpellInstance, sourceField.GetValue(info)); } catch { Console.WriteLine("failed with field " + sourceField.Name); } } return newSpellInstance; }