Реализация универсального и расширенного метода ObservableCollection с пользовательской моделью данных в C # - PullRequest
0 голосов
/ 24 января 2019

В моем приложении MVVM есть класс модели MessageModel, который содержит следующие конструкторы:

public class MessageModel
{
        // Private fields here 

        public MessageModel()
        {
        }

        public MessageModel(MessageType msgType, DateTime dateTime, string strSource, string strText)
        {
            this._type = msgType;
            this._dateTime = dateTime;
            this._source = strSource;
            this._text = strText;
        }

        // Public properties here
}

В виду модель у меня есть ниже объявление:

ObservableCollection<MessageModel> myMessages = new ObservableCollection<MessageModel>();

Теперь мне нужно добавлять элементы в эту коллекцию всегда на первой позиции (в начале), поэтому я делаю:

myMessages.Insert(0, new MessageModel() { 
                             // values here 
                         });

Как и я, если часто я хочу реализовать метод расширения для коллекции, как это (он не компилируется):

public static class CollectionExtensions
{
    public static void Insert<T>(this ObservableCollection<T> collection, MessageType messageType, IParticipant sender, string strText)  where T : MessageModel
    {
        collection.Insert(0, new T()
        {
            MessageType = messageType,
            MessageDateTime = DateTime.Now,
            MessageSource = sender.ParticipantName,
            MessageText = strText
        });
    }
}

Тогда я могу сделать:

myMessages.Insert(messageType, sender, text);

Это возможно? Если да, то как?

Я использую Visual Studio 2008 и NET Framework 3.5

1 Ответ

0 голосов
/ 25 января 2019

Сначала вы должны добавить new(), чтобы разрешить использование конструктора в вашем методе расширения

public static class CollectionExtensions
{
    public static void Insert<T>(this ObservableCollection<T> collection, MessageType messageType, IParticipant sender, string strText)  where T : MessageModel, new()
    {
        collection.Insert(0, new T()
        {
            MessageType = messageType,
            MessageDateTime = DateTime.Now,
            MessageSource = sender.ParticipantName,
            MessageText = strText
        });
    }
}

Затем вы должны использовать ваш метод расширения следующим образом:

myMessages.Insert<MessageModel>(messageType, sender, text);
...