проверить свойство сложного класса с помощью общего списка, используя отражение - PullRequest
0 голосов
/ 23 ноября 2018

привет, у меня сложный класс с общим списком, и мне нужно проверить разницу между двумя классами

это мой класс

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.Список <> и свойство наследования.

Заранее благодарим за помощь

1 Ответ

0 голосов
/ 24 ноября 2018

Что вы можете сделать, когда дело доходит до объектов, которые являются списками, так это проверить, действительно ли они являются списками,

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;
            }
        }

также исключить индексированные параметры, такие как этот ["тест"] и т. Д.

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

в вашей

var oProperty в строке oType.GetProperties ()

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...