【问题标题】:Change all variables from specific Model using Reflection使用反射更改特定模型中的所有变量
【发布时间】:2018-07-24 18:07:15
【问题描述】:

我有一个从 Json 文件生成的大模型,我在所有类中添加了一个名为 Sigla_Container 的字段。如何直接为所有名称为 Sigla_Container 的字段设置值,而无需一一设置?

模型如下:

public class ContainerViagemContainer
{
    [Key]
    [JsonProperty("Sigla")]
    public string Sigla_Container { get; set; }
    public object Descricao { get; set; }
    public int Tara { get; set; }
    public int Dimensao { get; set; }
    public object Tipo { get; set; }
}

public class ContainerViagemArmador
{
    [Key]
    [Column(Order = 1)]
    [JsonProperty("Id")]
    public int Id_Armador { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 2)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public object CodigoGeParcei { get; set; }
    public string Nome { get; set; }
    public string Sigla { get; set; }
    public object CnpjCpf { get; set; }
    public object Endereco { get; set; }
    public object Cep { get; set; }
    public object Site { get; set; }
}

public class ContainerViagemNavio
{
    [Key]
    [Column(Order = 1)]
    [JsonProperty("Nome")]
    public string Nome_Navio { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 2)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public ContainerViagemArmador Armador { get; set; }
    public string ImagemNavio { get; set; }
    public double Comprimento { get; set; }
    public int Lloyd { get; set; }
    public string CallSign { get; set; }
    public int CapacidadeTeus { get; set; }
    public string Shortname { get; set; }
}

public class ContainerViagemJanelaAtracacao
{
    [Key]
    [Column(Order = 1)]
    [JsonProperty("Descricao")]
    public string Descricao_JanelaAtracacao { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 2)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public string Dia { get; set; }
    public string Inicio { get; set; }
    public string Fim { get; set; }
}

public class ContainerViagemBerco
{
    [Key]
    [Column(Order = 1)]
    [JsonProperty("Ponto")]
    public string Ponto_Berco { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 2)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public string Descricao { get; set; }
    public string Sentido { get; set; }
    public ContainerViagemJanelaAtracacao JanelaAtracacao { get; set; }
}

public class ContainerViagemViagem
{
    [Key]
    [Column(Order = 1)]
    [JsonProperty("Id")]
    public int Id_Viagem { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 2)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public string NumeroAtracacao { get; set; }
    public string NumeroViagem { get; set; }
    public string Status { get; set; }
    public string Joint { get; set; }
    public string Servico { get; set; }
    public string MotivoEspera { get; set; }
    public string LiberacaoRecebimento { get; set; }
    public ContainerViagemNavio Navio { get; set; }
    public string ChegadaPrevista { get; set; }
    public string AtracacaoPrevista { get; set; }
    public string SaidaPrevista { get; set; }
    public string DeadLine { get; set; }
    public string Chegada { get; set; }
    public string Atracacao { get; set; }
    public string Saida { get; set; }
    public string InicioOperacao { get; set; }
    public string FimOperacao { get; set; }
    public string TipoOperacao { get; set; }
    public string CodigoCodesp { get; set; }
    public double CaladoAtracacao { get; set; }
    public object CaladoDesatracacao { get; set; }
    public string NumeroViagemImportacao { get; set; }
    public string NumeroViagemExportacao { get; set; }
    public ContainerViagemBerco Berco { get; set; }
    public int PrevisaoDescarga { get; set; }
    public int PrevisaoEmbarque { get; set; }
    public int PrevisaoRemocao { get; set; }
    public string LocalAtracacao { get; set; }
}

public class ContainerViagemCarreta
{
    [Key]
    [Column(Order = 1)]
    public string PlacaCavalo { get; set; }
    [Key]
    [Column(Order = 2)]
    public string PlacaReboque { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 3)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public string Entrada { get; set; }
    public string Saida { get; set; }
    public int PesoEntrada { get; set; }
    public int PesoSaida { get; set; }
    public object CNH { get; set; }
    public object Motorista { get; set; }
}

public class ContainerViagemImportador
{
    [Key]
    [Column(Order = 1)]
    [JsonProperty("Id")]
    public int Id_Importador { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 2)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public object CodigoGeParcei { get; set; }
    public string Nome { get; set; }
    public object Sigla { get; set; }
    public object CnpjCpf { get; set; }
    public object Endereco { get; set; }
    public object Cep { get; set; }
    public object Site { get; set; }
}

public class ContainerViagemBl
{
    [Key]
    [Column(Order = 1)]
    [JsonProperty("Numero")]
    public string Numero_BL { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 2)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public int Lote { get; set; }
    public ContainerViagemImportador Importador { get; set; }
    public object Despachante { get; set; }
    public object Armador { get; set; }
    public object Nvocc { get; set; }
    public string Data { get; set; }
    public string PresencaCarga { get; set; }
    public object DataEnvioPresCarga { get; set; }
    public object StatusEnvioPresCarga { get; set; }
    public object Recinto { get; set; }
    public object Setor { get; set; }
    public object Situacao { get; set; }
    public string Documento { get; set; }
    public object TipoDocumento { get; set; }
    public object DataDocumento { get; set; }
    public object DataArmazenagem { get; set; }
    public object Mercadorias { get; set; }
    public object Containers { get; set; }
    public object Viagem { get; set; }
    public object PortoOrigem { get; set; }
    public object QuantidadeContainers { get; set; }
    public object QuantidadeContainerEntradaTerminal { get; set; }
    public bool Bloqueio { get; set; }
    public object MotivoCaptacao { get; set; }
    public object Status { get; set; }
    public object Desembaraco { get; set; }
    public int CifMoedaOrig { get; set; }
    public object NumeroCE { get; set; }
}

public class ContainerViagemLacresEntrada
{
    [Key]
    [Column(Order = 1)]
    [JsonProperty("Origem")]
    public string Origem_LacresEntrada { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 2)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public string Verificado { get; set; }
    public string Tipo { get; set; }
    public object Status { get; set; }
}

public class ContainerViagemLacresSaida
{
    [Key]
    [Column(Order = 1)]
    [JsonProperty("Origem")]
    public string Origem_LacresSaida { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 2)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public string Verificado { get; set; }
    public string Tipo { get; set; }
    public string Status { get; set; }
}

public class ContainerViagemAvaria
{
    [Key]
    [Column(Order = 1)]
    [JsonProperty("Local")]
    public string Local_Avaria { get; set; }
    [Key]
    [Column(Order = 2)]
    [JsonProperty("Tipo")]
    public string Tipo_Avaria { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 3)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public string Complemento { get; set; }
    public string Descricao { get; set; }
    public string TermoAvaria { get; set; }
}

public class ContainerViagem
{
    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID_ContainerViagem { get; set; }

    [Key, ForeignKey("ContainerViagemContainer")]
    [Column(Order = 2)]
    public string Sigla_Container { get; set; }
    public virtual ContainerViagemContainer ContainerViagemContainer { get; set; }

    public object IdCtis { get; set; }

    public ContainerViagemContainer Container { get; set; }

    public object Exportador { get; set; }
    public ContainerViagemViagem Viagem { get; set; }
    public int TipoViagem { get; set; }
    public string PortoOrigem { get; set; }
    public string PortoDestino { get; set; }
    public object PortoDestinoFinal { get; set; }
    public string Entrada { get; set; }
    public string Saida { get; set; }
    public object StatusScanner { get; set; }
    public string Status { get; set; }
    public string StatusSigvig { get; set; }
    public int PesoManifCarga { get; set; }
    public int PesoManifTara { get; set; }
    public int PesoManifBruto { get; set; }
    public int PesoCarga { get; set; }
    public int PesoBruto { get; set; }
    public int DivergenciaPeso { get; set; }
    public double DivergenciaPesoPorcent { get; set; }
    public bool ExcessoDivergenciaPeso { get; set; }
    public ContainerViagemCarreta Carreta { get; set; }
    public IList<ContainerViagemBl> Bls { get; set; }
    public IList<ContainerViagemLacresEntrada> LacresEntrada { get; set; }
    public IList<ContainerViagemLacresSaida> LacresSaida { get; set; }
    public object TermoAvaria { get; set; }
    public IList<ContainerViagemAvaria> Avarias { get; set; }
    public object Temperatura { get; set; }
    public object SD { get; set; }
    public object Booking { get; set; }
    public object Agendamento { get; set; }
    public object Armador { get; set; }
    public object Imos { get; set; }
    public object Cheio { get; set; }
    public object Regime { get; set; }
    public object Documentos { get; set; }
    public IList<object> Desova { get; set; }
    public int HreqId { get; set; }
    public int TmodId { get; set; }
    public int PesoCargaVGM { get; set; }
    public int PesoTaraVGM { get; set; }
    public int PesoBrutoVGM { get; set; }
}

如您所见,字段 Sigla_Container 在所有类中,我尝试了下面的代码来获取这些字段,但是如何设置这些字段的值?

ContainerViagem containerViagem = JsonConvert.DeserializeObject<ContainerViagem>(strToken["ContainerViagem"].ToString());
                        containerViagem.Container.Sigla_Container = container;

     foreach (var campoJson in containerViagem.GetType().GetProperties())
     {
          if (campoJson.Name.Equals("Sigla_Container"))
          {

          }
     }

【问题讨论】:

  • 我觉得第一个问题应该是:为什么要到处找这个字段?这种冗余是维护地狱。
  • 我正在反序列化一个 JSON 文件,但由于 JSON 中有许多块和数组,它定义每个块都是一个表。问题是我应该为所有这些表添加一个外键,它将是 Sigla_Container 字段。我不知道如何在不需要在每个表中创建外键的情况下做到这一点。
  • 好吧,如果你使用 EF 存储这个结构,EF 会为你填充 FK。
  • 我试过这个。我在所有模型中都添加了外键,但是当我尝试添加到 dbcontext 时,外键是空的,它们没有反映主键的值。
  • 是的,好吧,我显然不知道你的 JSON 的内容。如果对象在 JSON 中不相关,EF 不会为您连接它们,您唯一的选择是单独设置每个属性。

标签: c# entity-framework-6 entity system.reflection


【解决方案1】:

使用SetValue。将对象实例作为第一个参数传递,将新值作为第二个参数传递。

campoJson.SetValue(containerViagem, "New value");

【讨论】:

  • 问题是它只是在模型ContainerViagem中设置了Sigla_Container的值,我想设置所有变量Sigla_Container。
  • 如果要填充更多属性,请删除或更改 ` if (campoJson.Name.Equals("Sigla_Container"))` 中的条件。
  • 但我尝试添加此代码:campoJson.SetValue(containerViagem, container); 它只会更改第一个模型 ContainerViagem 的变量 Sigla_Container,而不是从它调用的其他模型。
  • 有没有办法可以在根模型上设置主要变量 Sigla_Container,然后它会反映和所有其他 Sigla_Container?
猜你喜欢
  • 2011-02-24
  • 2019-01-22
  • 2020-03-29
  • 2014-06-26
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
相关资源
最近更新 更多