Estou desenvolvendo uma ferramenta para modificar um jogo e quero refazer um tipo personalizado como classe C#. Este tipo tem 1 propriedade obrigatória e muitas outras opcionais. Estou obtendo todos os dados para a classe personalizada do arquivo XML, então há alguma maneira de tornar este construtor melhor?
public class Item(
string identifier,
string? nameIdentifier = null,
string? fallbackNameIdentifier = null,
string? descriptionIdentifier = null,
string? name = null,
string? aliases = null,
string? tags = null,
Item.Categories? category = null,
bool? allowAsExtraCargo = null,
float? interactDistance = null,
float? interactPriority = null,
bool? interactThroughWalls = null,
bool? hideConditionBar = null,
bool? hideConditionInTooltip = null,
bool? requireBodyInsideTrigger = null,
bool? requireCursorInsideTrigger = null,
bool? requireCampaignInteract = null,
bool? focusOnSelected = null,
float? offsetOnSelected = null,
float? health = null,
bool? allowSellWhenBroken = null,
bool? indestructible = null,
bool? damagedByExplosions = null,
float? explosionDamageMultiplier = null,
bool? damagedByProjectiles = null,
bool? damagedByMeleeWeapons = null,
bool? damagedByRepairTools = null,
bool? damagedByMonsters = null,
bool? fireProof = null,
bool? waterProof = null,
float? impactTolerance = null,
float? onDamagedThreshold = null,
float? sonarSize = null,
bool? useInHealthInterface = null,
bool? disableItemUsageWhenSelected = null,
string? cargoContainerIdentifier = null,
bool? useContainedSpriteColor = null,
bool? useContainedInventoryIconColor = null,
float? addedRepairSpeedMultiplier = null,
float? addedPickingSpeedMultiplier = null,
bool? cannotRepairFail = null,
string? equipConfirmationText = null,
bool? allowRotatingInEditor = null,
bool? showContentsInTooltip = null,
bool? canFlipX = null,
bool? canFlipY = null,
bool? isDangerous = null,
int? maxStackSize = null,
bool? allowDroppingOnSwap = null,
bool? resizeHorizontal = null,
bool? resizeVertical = null,
string? description = null,
string? allowedUpgrades = null,
bool? hideInMenus = null,
string? subcategory = null,
bool? linkable = null,
string? spriteColor = null,
float? scale = null)
{
public enum Categories
{
Decorative,
Machine,
Medical,
Weapon,
Diving,
Equipment,
Fuel,
Electrical,
Material,
Alien,
Wrecked,
Misc
}
// All of Item attributes
public required string identifier = identifier;
public string? nameIdentifier = nameIdentifier;
public string? fallbackNameIdentifier = fallbackNameIdentifier;
public string? descriptionIdentifier = descriptionIdentifier;
public string? name = name;
public string? aliases = aliases;
public string? tags = tags;
public Categories? category = category;
public bool? allowAsExtraCargo = allowAsExtraCargo;
public float? interactDistance = interactDistance;
public float? interactPriority = interactPriority;
public bool? interactThroughWalls = interactThroughWalls;
public bool? hideConditionBar = hideConditionBar;
public bool? hideConditionInTooltip = hideConditionInTooltip;
public bool? requireBodyInsideTrigger = requireBodyInsideTrigger;
public bool? requireCursorInsideTrigger = requireCursorInsideTrigger;
public bool? requireCampaignInteract = requireCampaignInteract;
public bool? focusOnSelected = focusOnSelected;
public float? offsetOnSelected = offsetOnSelected;
public float? health = health;
public bool? allowSellWhenBroken = allowSellWhenBroken;
public bool? indestructible = indestructible;
public bool? damagedByExplosions = damagedByExplosions;
public float? explosionDamageMultiplier = explosionDamageMultiplier;
public bool? damagedByProjectiles = damagedByProjectiles;
public bool? damagedByMeleeWeapons = damagedByMeleeWeapons;
public bool? damagedByRepairTools = damagedByRepairTools;
public bool? damagedByMonsters = damagedByMonsters;
public bool? fireProof = fireProof;
public bool? waterProof = waterProof;
public float? impactTolerance = impactTolerance;
public float? onDamagedThreshold = onDamagedThreshold;
public float? sonarSize = sonarSize;
public bool? useInHealthInterface = useInHealthInterface;
public bool? disableItemUsageWhenSelected = disableItemUsageWhenSelected;
public string? cargoContainerIdentifier = cargoContainerIdentifier;
public bool? useContainedSpriteColor = useContainedSpriteColor;
public bool? useContainedInventoryIconColor = useContainedInventoryIconColor;
public float? addedRepairSpeedMultiplier = addedRepairSpeedMultiplier;
public float? addedPickingSpeedMultiplier = addedPickingSpeedMultiplier;
public bool? cannotRepairFail = cannotRepairFail;
public string? equipConfirmationText = equipConfirmationText;
public bool? allowRotatingInEditor = allowRotatingInEditor;
public bool? showContentsInTooltip = showContentsInTooltip;
public bool? canFlipX = canFlipX;
public bool? canFlipY = canFlipY;
public bool? isDangerous = isDangerous;
public int? maxStackSize = maxStackSize;
public bool? allowDroppingOnSwap = allowDroppingOnSwap;
public bool? resizeHorizontal = resizeHorizontal;
public bool? resizeVertical = resizeVertical;
public string? description = description;
public string? allowedUpgrades = allowedUpgrades;
public bool? hideInMenus = hideInMenus;
public string? subcategory = subcategory;
public bool? linkable = linkable;
public string? spriteColor = spriteColor;
public float? scale = scale;
public List<XmlElement>? children = null;
/// <summary>
/// Gets this Item represent
/// </summary>
/// <returns>XmlElement represent of the Item</returns>
public XmlElement GetAsXml()
{
XmlDocument xmlDoc = new();
XmlElement newItem = xmlDoc.CreateElement("Item");
foreach(var attr in this.GetType().GetProperties())
{
if (attr.GetValue(this, null) != null)
{
newItem.SetAttribute(attr.Name.ToLower(), value: attr.GetValue(this, null).ToString());
}
}
newItem.InnerText = "";
if (this.children != null)
{
foreach (var child in this.children)
{
newItem.AppendChild(child);
}
}
return newItem;
}
}
}
Pensei em duas maneiras de fazer isso: passando propriedades como um dicionário ou um novo tipo personalizado contendo todas as propriedades disponíveis, mas não tenho certeza se seriam melhores.
Que tal isso, defina uma classe para armazenar todas as suas propriedades opcionais:
E passe a
ItemData
classe para oItem
construtor:Você também terá que atualizar seu
Item.GetAsXml()
método para serializar corretamente seus dados:Você pode então criar itens como:
Ao seriar o item acima:
Você obtém esta saída: