Клонировать объект в другой объект, но исключить некоторые свойства? - PullRequest
0 голосов
/ 17 февраля 2012

Я хотел бы клонировать объект в другой объект, но исключить свойство из исходного объекта. Например, если объект A имеет имя, зарплату, местоположение, то клонированный объект должен иметь только свойства имени и зарплаты, если я исключил свойство местоположения. Спасибо.

Ответы [ 2 ]

1 голос
/ 08 января 2013

Вот метод расширения, который я использую для этого:

public static T CloneExcept<T, S>(this T target, S source, string[] propertyNames)
{
    if (source == null)
    {
        return target;
    }
    Type sourceType = typeof(S);
    Type targetType = typeof(T);
    BindingFlags flags = BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance;

    PropertyInfo[] properties = sourceType.GetProperties();
    foreach (PropertyInfo sPI in properties)
    {
        if (!propertyNames.Contains(sPI.Name))
        {
            PropertyInfo tPI = targetType.GetProperty(sPI.Name, flags);
            if (tPI != null && tPI.PropertyType.IsAssignableFrom(sPI.PropertyType))
            {
                tPI.SetValue(target, sPI.GetValue(source, null), null);
            }
        }
    }
    return target;
}

Вы также можете проверить Automapper.

А вот пример того, как я использую расширение.

var skipProperties = new[] { "Id", "DataSession_Id", "CoverNumber", "CusCode", "BoundAttempted", "BoundSuccess", "DataSession", "DataSessions","Carriers" };
DataSession.Quote = new Quote().CloneExcept(lastSession.Quote, skipProperties);

Поскольку это реализовано как метод расширения, он модифицирует вызывающий объект, а также возвращает его для удобства. Это обсуждалось в [вопросе]: Лучший способ клонировать свойства разнородных объектов

0 голосов
/ 17 февраля 2012

если вы говорите о Java, то вы можете попробовать ключевое слово "transient".по крайней мере, это работает для сериализации.

...