Метод расширения C # для объектов с определенным атрибутом - PullRequest
0 голосов
/ 29 марта 2012

Я создал метод расширения, который сообщит мне размер каждого создаваемого мной объекта. как это:

public static int CalculateKilobytes(this object notSuspectingCandidate)
{
    using (MemoryStream stream = new MemoryStream())
    {
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(stream, notSuspectingCandidate);
        return stream.ToArray().Count() / 1000;
    }
}

Поскольку я использую сериализацию, не все объекты смогут вернуть ответ, только сериализуемые. Есть ли способ присоединить этот метод к объекту, который можно сериализовать?

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Это очень плохая практика, чтобы сериализовать объект только для того, чтобы получить его размер, если вы планируете сериализовать его позже.

Используйте с осторожностью.

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

Эта проверка может сделать работу.

if (notSuspectingCandidate.GetType().GetCustomAttributes(typeof(SerializableAttribute), true).Length == 0)
{
    return -1; // An error
}

Другой способ - добавить метод расширения в ISerializable и использовать интерфейс во всех необходимых типах.

public static int CalculateKilobytes(this ISerializable notSuspectingCandidate)
{
    using (MemoryStream stream = new MemoryStream())
    {
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(stream, notSuspectingCandidate);
        return stream.ToArray().Count() / 1000;
    }
}
0 голосов
/ 29 марта 2012

вы можете использовать Type.IsSerializable Свойство .

public static int CalculateKilobytes(this object notSuspectingCandidate)
    {          
            using (MemoryStream stream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                if (notSuspectingCandidate.GetType().IsSerializable) {
                    formatter.Serialize(stream, notSuspectingCandidate);
                    return stream.ToArray().Count() / 1000;
                }
                return 0;
            }         
    }
...