Как создать Универсальный StateManagedCollection?

Вам необходимо изменить порядок байтов. Это связано с разницей между Little Endian и Big Endian, которая заключается в том, является ли младший байт первым или последним - вы можете узнать больше об этом, прибегая к помощи Google.

Java хранит вещи с прямым порядком байтов. Если ваша система имеет младший порядок, вам нужно обратить байты перед преобразованием. BitConverter предлагает метод для определения порядка байтов. Например:

        // assuming we're starting with a big-endian byte[]
        // we check if we're using little endian, and if so convert the byte[] to little endian (by reversing its order) before doing the double conversion
        byte[] b = new byte[] { 64, 256-6, 256 - 51, 112, 256 - 93, 256 - 41, 10, 61 };
        bool little = BitConverter.IsLittleEndian;
        if (little)
        {
            byte[] nb = new byte[b.Length];
            for(int i =0; i<b.Length; i++)
            {
                nb[i] = b[b.Length - 1 - i];
            }
            double doub = BitConverter.ToDouble(nb, 0);
        }
        else
        {
            double doub = BitConverter.ToDouble(b, 0);
        }
8
задан Larsenal 5 July 2012 в 19:09
поделиться

3 ответа

DanHerbert получил его. Штопка, я провел часы на это также! В процессе попытки ответить на этот вопрос я придумал упрощенный универсальный StateManagedCollection, который наследовался встроенному StateManagedCollection платформы, на основе версии здесь. Возможно, Вы найдете это полезным. Полный исходный код моего демонстрационного проекта, доступного здесь.

using System;
using System.Collections;
using System.Collections.Specialized;
using System.Security.Permissions;
using System.Web;
using System.Collections.Generic;
using System.Web.UI;

namespace Web
{
    public abstract class StateManagedCollection<T> : StateManagedCollection, IList<T>, ICollection<T>, IEnumerable<T>
        where T : class, IStateManagedItem, new()
    {

        protected override object CreateKnownType(int index)
        {
            return Activator.CreateInstance<T>();
        }

        protected override Type[] GetKnownTypes()
        {
            return new Type[] { typeof(T) };
        }

        protected override void SetDirtyObject(object o)
        {
            ((IStateManagedItem)o).SetDirty();
        }

        #region IList<T> Members

        public int IndexOf(T item)
        {
            return ((IList)this).IndexOf(item);
        }

        public void Insert(int index, T item)
        {
            ((IList)this).Insert(index, item);
            if (((IStateManager)this).IsTrackingViewState)
            {
                this.SetDirty();
            }
        }

        public void RemoveAt(int index)
        {
            ((IList)this).RemoveAt(index);
            if (((IStateManager)this).IsTrackingViewState)
            {
                this.SetDirty();
            }
        }

        public T this[int index]
        {
            get { return (T)this[index]; }
            set { this[index] = value; }
        }

        #endregion

        #region ICollection<T> Members

        public void Add(T item)
        {
            ((IList)this).Add(item);
            this.SetDirty();
        }

        public bool Contains(T item)
        {
            return ((IList)this).Contains(item);
        }

        public void CopyTo(T[] array, int arrayIndex)
        {
            ((IList)this).CopyTo(array, arrayIndex);
        }

        public bool IsReadOnly
        {
            get { return false; }
        }

        public bool Remove(T item)
        {
            if (((IList)this).Contains(item))
            {
                ((IList)this).Remove(item);
                return true;
            }
            return false;
        }

        #endregion


        #region IEnumerable<T> Members

        IEnumerator<T> IEnumerable<T>.GetEnumerator()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region IEnumerable Members

        IEnumerator IEnumerable.GetEnumerator()
        {
            return ((IList)this).GetEnumerator();

        }

        #endregion
    }
}
3
ответ дан 5 December 2019 в 21:23
поделиться

Второй пример Вы нашли почти работы, это просто отсутствует немного. Все, что было необходимо, было 2 методами в основном управлении.

Добавьте этот код к AppointmentControl.cs файл и это будут работать.

protected override object SaveViewState()
{
    if (appointments != null)
        return appointments.SaveViewState();
    return null;
}

protected override void LoadViewState(object savedState)
{
    appointments = new AppointmentCollection();
    appointments.LoadViewState(savedState);
}

Код в сайте в качестве примера был довольно достоин. Это реализовало все интерфейсы, это должно иметь и сделало довольно хорошее задание. То, где это развалилось, было то, что, несмотря на наличие всего кода этому было нужно в абстрактных битах, которые не имели значения, потому что на интерфейсы не сослались в местах, которыми они должны были быть.

Используемые классы набора не имели ничего "специального" о них кроме реализации нескольких интерфейсов. Платформа автоматически не назовет эти методы. Платформа однако назовет переопределенные методы, которые я записал выше, который необходимо реализовать для управления для сохранения элементов в наборе. Пока Вы называете их, все будет работать.

4
ответ дан 5 December 2019 в 21:23
поделиться

Я использовал код выше, предоставленное решение в порядке, но я получал исключение - "StackOverflow" круто :) проблему можно воспроизвести, добавив несколько дочерние элементы на странице aspx и переключитесь в представление «Дизайн» в представление дизайна Visual Studio (просто перезапустите Visual Studio, и никто не знает, что происходит…).

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IList)this).GetEnumerator();

    }

Думаю, я понял это, просто измените реализацию вышеупомянутого метода следующим образом:

    IEnumerator IEnumerable.GetEnumerator()
    {
        // return ((IList)this).GetEnumerator();
        return this.GetEnumerator();

    } 

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

0
ответ дан 5 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: