【问题标题】:check property of complex class with generic list using reflection使用反射检查具有通用列表的复杂类的属性
【发布时间】:2018-11-23 16:58:36
【问题描述】:

嗨,我有一个带有通用列表的复杂类,我需要检查两个类的区别

这是我的课

public partial class Contatto
{

    [DataMember]
    public int? Id { get; set; }

    private int? tyContatto { get; set; }
    [DataMember]
    public DContatto DContatto { get; set; }

    [DataMember]
    public string Cognome { get; set; }
    [DataMember]
    public string Nome { get; set; }
    [DataMember]
    public string RagioneSociale { get; set; }

    private int? tySesso{get; set;}
    [DataMember]
    public DSesso DSesso { get; set; }

    [DataMember]
    public DateTime TsValidita { get; set; }
    [DataMember]
    public DateTime DtNascita { get; set; }

    private int? idComune { get; set; }
    [DataMember]
    public Comune Comune { get; set; }

    [DataMember]
    public string CdFiscale { get; set; }
    [DataMember]
    public string PartitaIva { get; set; }

    private int? tyIso { get; set; }

    [DataMember]
    public DIso DIso { get; set; }

    [DataMember]
    public int? IdUser { get; set; }
    [DataMember]
    public string UserId { get; set; }

    [DataMember]
    public List<Telefono> LsTelefono { get; set; }
    [DataMember]
    public List<Mail> LsMail { get; set; }
    [DataMember]
    public List<Indirizzo> LsIndirizzo { get; set; }

}

这是我的递归方法

    private static object CheckRecursivelyDifference(object old, object nuevo)
    {
        var oType = old.GetType();
        foreach (var oProperty in oType.GetProperties())
        {
            var oOldValue = oProperty.GetValue(old, null); //letto dal SqlServer
            var oNewValue = oProperty.GetValue(nuevo, null);  //letto dal gestionale

            if (oProperty.PropertyType.Module.ScopeName != "CommonLanguageRuntimeLibrary")
                CheckRecursivelyDifference(oOldValue, oNewValue);
            else
            {
                // this will handle the scenario where either value is null
                if (!object.Equals(oOldValue, oNewValue))
                {
                    if (oNewValue == null && oOldValue != null) //vince sempre il vecchio gestionale
                        oProperty.SetValue(nuevo, oOldValue);
                }
            }

        }
        return nuevo;
    }

该方法适用于普通类,但是当将属性读取为 System.Collection.Generic.List 时不起作用

我的问题是如何检查 System.Collection.Generic.List 和继承属性。

提前感谢您的帮助

【问题讨论】:

    标签: c# wcf inheritance compare


    【解决方案1】:

    当涉及到作为列表的对象时,您可以做的是检查它们是否确实是列表,

    public static bool IsGenericList(object value)
            {
                if (value == null)
                    return false;
    
                try
                {
                    var val =  value as IList;
                    if (val == null)
                        return false;
    
                    if ((typeof(BaseConversion)).IsAssignableFrom(val.GetType().GetGenericArguments()[0]))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch
                {
                    return false;
                }
            }
    

    还排除索引参数,如 this["test"],etc

    objType.GetProperties().Where(x => x.GetIndexParameters().Length == 0 
    

    在你的

    oType.GetProperties() 中的 var oProperty

    行。

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 1970-01-01
      • 2013-05-24
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多