Расширение (наследование) класса framwork сущности (без частичного использования) - PullRequest
0 голосов
/ 13 июня 2011

Как это началось?

Я хотел добавить в radGridView два столбца, которые не входят в коллекцию бизнес-объектов. В частности, NewUrl и NewIdOnFilehost. :)

Так что я пытался сделать?

Я положил это в сетку

radGridViewReuploadStatus.ItemsSource = FileHostings.Filesonic.getdAllDeletedLinks();

Затем я добавил их новые столбцы

<telerik:GridViewColumn Header="New F.H.Id" UniqueName="NewFilehostId" Width="*"></telerik:GridViewColumn>
                <telerik:GridViewColumn Header="New URL" UniqueName="NewUrl" Width="*"></telerik:GridViewColumn>

Так в чем же проблема?

radGridViewReuploadStatus.Rows не существует. Я не знаю, почему они не добавили его в wpf radGridView, это в его версии aspx. Мне удалось получить строки с помощью getChildsOfType, но это явно не идеальный способ.

Что я сделал дальше?

class dlExtended : DownloadLink {
        public string NewUrl { get; set; }
        public string NewIdOnFilehost { get; set; }
    }

Наконец-то ПРОБЛЕМА - чего я не понимаю

Как мне сделать dlExtended из DownloadLink? (я знаю, что это неправильное название соглашения, это только для примера :)) И как мне составить список dlExtended из коллекции DownloadLink? Должен быть лучший способ, чем использовать foreach!

Теперь я, вероятно, делаю это неправильно

Так что теперь я должен сделать конструктор и установить КАЖДОЕ свойство dlExneded в соответствии с переданным в переданном DownloadLink?!

Ну, может быть, это можно сделать с помощью отражения, как это

public DownloadLinkExtended(DownloadLink origDl){
        PropertyInfo[] myObjectProperties = origDl.GetType().GetProperties(); //BindingFlags.Public | BindingFlags.NonPublic
        foreach (PropertyInfo pi in myObjectProperties)
        {
            if (pi.GetValue(origDl, null) != null)
            {
                pi.SetValue(this, pi.GetValue(origDl, null), null);
            }
        }
    }

Ну, это глупо. Так что же я не получу при расширении класса и добавлении в него новых свойств?

Я знаю, что классы EF4 являются частичными, и я могу добавить к ним свойства просто через частичный класс, но я хочу, чтобы они были только для сетки, а не где-либо еще.

Ответы [ 2 ]

0 голосов
/ 15 июня 2011

Мой "мелкий" копир объектов очень похож на ваш, но нулевой тест немного отличается.Он также имеет удобную оболочку для метода расширения - поэтому он должен быть в статическом классе.

    /// <summary>
    /// Copy an object to destination object, only matching fields will be copied
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="sourceObject">An object with matching fields of the destination object</param>
    /// <param name="destObject">Destination object, must already be created</param>
    public static void ShallowCopyTo<T>(this object sourceObject, ref T destObject)
    {
        Copy<T>(sourceObject,ref destObject);
    }
    /// <summary>
    /// Copy an object to destination object, only matching fields will be copied
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="sourceObject">An object with matching fields of the destination object</param>
    /// <param name="destObject">Destination object, must already be created</param>
    public static void Copy<T>(object sourceObject, ref T destObject)
    {
        //  If either the source, or destination is null, return
        if (sourceObject == null || destObject == null)
            return;

        //  Get the type of each object
        Type sourceType = sourceObject.GetType();
        Type targetType = destObject.GetType();

        //  Loop through the source properties
        foreach (PropertyInfo p in sourceType.GetProperties())
        {
            //  Get the matching property in the destination object
            PropertyInfo targetObj = targetType.GetProperty(p.Name);
            //  If there is none, skip
            if (targetObj == null)
                continue;

            //  Set the value in the destination
            targetObj.SetValue(destObject, p.GetValue(sourceObject, null), null);
        }
    }

Однако у меня также есть глубокий копир, но он работает только с сериализуемыми объектами, поэтому посмотрите нагенерация кода, которую вы используете из EDMX, я не думаю, что она будет работать непосредственно с классами EF, но работает с классами, сгенерированными POCO.

/// <summary>
/// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx
/// 
/// Provides a method for performing a deep copy of an object.
/// Binary Serialization is used to perform the copy.
/// </summary>

public static class ObjectCopier
{
    /// <summary>
    /// Perform a deep Copy of the object.
    /// </summary>
    /// <typeparam name="T">The type of object being copied.</typeparam>
    /// <param name="source">The object instance to copy.</param>
    /// <returns>The copied object.</returns>
    public static T Clone<T>(this T source)
    {
        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type must be serializable.", "source");
        }

        // Don't serialize a null object, simply return the default for that object
        if (Object.ReferenceEquals(source, null))
        {
            return default(T);
        }

        IFormatter formatter = new BinaryFormatter();
        Stream stream = new MemoryStream();
        using (stream)
        {
            formatter.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
0 голосов
/ 14 июня 2011

Если это классы EF (а не POCO из шаблонов T4), то вы, возможно, не захотите наследовать их, потому что в итоге вы получите багаж EF.Кроме того, я думаю, что есть ряд потенциальных решений.

Если его использовать только в одном месте, вы можете улучшить цикл for с проекцией в Linq

var newthings = oldlinks.Select(old => new dlExtended{ NewUrl =old.NewUrl , NewIdOnFilehost =old.NewIdOnFilehost });

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

var newthings = oldlinks.Select(old => new dlExtended(old));

, который помещает свойство копирования в одно место.

Вы также можете создать универсальный метод расширения для копирования свойств с тем же именеммежду двумя объектами и использовать это различными способами.

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