具有特定属性的对象的C#扩展方法

时间:2012-03-29 15:59:31

标签: serialization extension-methods

我创建了一个扩展方法,它会告诉我我创建的每个对象的大小 像这样:

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;
    }
}

由于我正在使用serializaion,并非所有对象都能够返回答案,只有可序列化的答案。有没有办法将此方法附加到可以序列化的对象?

2 个答案:

答案 0 :(得分:0)

您可以使用Type.IsSerializable Property

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;
            }         
    }

答案 1 :(得分:0)

如果您计划稍后再次对其进行序列化,那么将对象序列化只是为了获得它的大小是一个非常糟糕的做法。

谨慎使用。

扩展方法将应用于所有对象,您必须检查其中是否包含自定义属性。

这项检查可以胜任。

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;
    }
}