Closed bruno-crr closed 1 year ago
Fala @bruno-crr tudo na paz?
A intenção é ir alterando esses campos aos poucos mas padronizar tudo que for enum, como você disse, vários campos sofreram alterações mas todos foram devidamente mapeados e atribuído o "DefaultValue".
Qual seria sua dúvida? É algum registro específico?
opa blz , minha dúvida é que antes eu fazia cast a prop da minha classe por exemplo o enum IndTipoFrete, na minha classe ele é um int? quando recupero o objeto pra gerar o SPED vem um int? e eu fazia CAST (IndTipoFrete)_nfe.TipoFrete algo assim, e esse cast em alguns enumeradores eu não consegui fazer, eu devo estar bobeando em alguma coisa =\
Entendi sua dúvida.
Se você tem uma classe "intermediária" que você usa no seu sistema você deve converter o valor para obter o enum correspondente. Vide o exemplo abaixo:
public class ClasseDoBrunoCrr
{
public string Info1 { get; set; }
public decimal Info2 { get; set; }
public IndTipoFrete TipoFreteEnum { get; set; }
public int? TipoFreteInt { get; set; }
}
PS: classe intermediária de exemplo ☝️
private object PopularClasseParaGerarSped(ClasseDoBrunoCrr obj)
{
var registroC100 = new FiscalBr.EFDFiscal.BlocoC.RegistroC100();
var meuEnumConvertido = ConverterTipoFreteIntParaEnum(obj.TipoFreteInt);
registroC100.IndFrt = meuEnumConvertido;
return registroC100;
}
PS: Método que vai popular a classe SPED, por exemplo. ☝️
private IndTipoFrete ConverterTipoFreteIntParaEnum(int? obj)
{
// obtém todos os valores do enum desejado
var enums = Enum.GetValues(typeof(IndTipoFrete));
IndTipoFrete enumDaProp = IndTipoFrete.None;
for (int i = 0; i < enums.Length; i++)
{
var enumConvertido = (IndTipoFrete)enums.GetValue(i);
if (enumConvertido.ToDefaultValue() == obj.Value.ToString())
enumDaProp = enumConvertido;
}
return enumDaProp;
}
PS: Método que vai converter o seu inteiro da classe intermediária para o enum desejado (tem formas melhores de fazer isso mas, esse é um exemplo básico) ☝️
/// <summary>
/// Sua chamada seria mais ou menos isso 👇
/// </summary>
private void DoMagic()
{
var obj = new ClasseDoBrunoCrr();
obj.Info1 = "qualquer coisa";
obj.Info2 = 0M;
// Se a sua classe já tiver o tipo enum desejado basta usar o enum direto
obj.TipoFreteEnum = IndTipoFrete.SemCobrancaFrete;
// Se a sua classe usar um tipo primitivo basta converter o DefaultValue para o tipo primitivo desejado
obj.TipoFreteInt = Convert.ToInt32(IndTipoFrete.SemCobrancaFrete.ToDefaultValue());
PopularClasseParaGerarSped(obj);
}
Eu nunca havia me deparado com essa situação mas, é possível melhorar.
Eu vou incluir uma issue para futuramente criar um método .FromEnumDefaultValue(obj enum)
.
É interessante ter os métodos de ida e volta do valor para cada enumerador. A conversão direta nesse caso não funciona pois o código do enum não é o mesmo que será usado.
/// <summary>
/// Indicador do tipo de frete
/// </summary>
public enum IndTipoFrete
{
[DefaultValue("")] None, // 0
[DefaultValue("0")] ContaEmitente, // 1
[DefaultValue("1")] ContaDestinatarioRemetente, // 2
[DefaultValue("2")] ContaTerceiros, // 3
[DefaultValue("9")] SemCobrancaFrete // 4
}
No caso desse enum, sem frete é o índice 4, mas o valor padrão é o 9.
EDIT Alterei esse enum para refletir os mesmos valores default.
/// <summary>
/// Indicador do tipo de frete
/// </summary>
public enum IndTipoFrete
{
[DefaultValue("")] None = -1,
[DefaultValue("0")] ContaEmitente = 0,
[DefaultValue("1")] ContaDestinatarioRemetente = 1,
[DefaultValue("2")] ContaTerceiros = 2,
[DefaultValue("9")] SemCobrancaFrete = 9
}
Agora fica mais fácil fazer a conversão direta:
public void ConverterIntParaEnumTest()
{
var indicadorFreteInt = 9; // Sem frete
var indicadorFreteEnum = (IndTipoFrete)indicadorFreteInt;
}
isso mesmo o erro que dava é que o enum na verdade tem um index inteiro que quando eu fazia o cast direto dava o erro, em alguns enums coincidentemente o index é o mesmo que o valor então funciona normal, mas nesse caso o método que vc mencionou de .FromEnumDefaultValue(obj enum) seria o ideal, no meu projeto eu uso um pacote de enums o SmartEnum que me da mais opções de trabalhar os enums , o que eu fiz foi incluir o enum do Fiscal.Br como um valor do SmartEnum, faco o casto baseado no meu próprio Enum e acesso o valor do Fiscal.Br
/// <summary>
/// Indicador do tipo de frete
/// </summary>
public enum IndTipoFrete
{
[DefaultValue("")] None = -1,
[DefaultValue("0")] ContaEmitente = 0,
[DefaultValue("1")] ContaDestinatarioRemetente = 1,
[DefaultValue("2")] ContaTerceiros = 2,
[DefaultValue("9")] SemCobrancaFrete = 9
}
dessa forma aqui sim ele não da erro no cast, já resolve pra quem estava usando a versão anterior e mudar pra 17.
Olha ai no caso em alguns enums do meu projeto eu já tinha a referência do Fiscal.Br
Entendi, vou fazer o commit e criar mais alguns testes antes de publicar o novo pacote 17.0.2 no Nuget.
Alterações feitas no commit https://github.com/orochasamuel/fiscalbr-net/commit/94fb794faa4ffef34c4d176a6e3f9fde0d183ec6.
Opa!!
Passando para avisar que os novos pacotes Nuget já estão disponíveis. o/
Vida longa e próspera 🖖
Boa tarde, atualizei o projeto pra versão 17.0.1 e vi que foram alterado vários campos para utilizar enumeradores, estou tendo um pouco de dificuldade em fazer o cast com alguns dos enums, poderia dar uma força ai de como fica o cast para pegar o valor do enum que está no atributo DefaultValue?