0

直接のプロパティとその「ToString」値のみが含まれるように、オブジェクトをシリアル化する簡単な方法を見つけようとしています。DataContext からのオブジェクトの場合、プロパティのプロパティを無視できるようにしたいと考えています (つまり、プロパティが複雑なオブジェクトである場合は、そのオブジェクトもシリアル化しないでください)。これは、プロパティがロードされていない場合に特に重要です。これは、「オブジェクトが破棄された後、オブジェクトにアクセスできません」というエラーが発生するためです...

以下を作成しましたが、元の datacontext 呼び出しで読み込まれていないプロパティにアクセスしようとすると失敗します。

string typeString = o.GetType().Name;
        StringBuilder xml = new StringBuilder();
        xml.AppendFormat("<{0}>\r\n", typeString);

        foreach (PropertyInfo property in o.GetType().GetProperties())
        {
            var propertyValue = property.GetValue(o, null);
            if (property.GetType() != typeof(System.Data.Linq.Binary) && property.PropertyType.Name != "EntitySet`1" && property.GetCustomAttributes(typeof(XmlIgnoreAttribute), true).Count() == 0)
            {
                xml.AppendFormat("<{0}>{1}</{0}>\r\n", property.Name, propertyValue);
            }

        }

        xml.AppendFormat("</{0}>", typeString);

        return xml.ToString();
4

1 に答える 1

1

適切な「無視」属性を持つストック シリアライザーを使用できます。たとえば、シリアル化したくないプロパティでDataContractSerializerIgnoreDataMemberAttributeを使用します。

概説したアプローチに固執したい場合は、 PropertyInfo.PropertyTypeをチェックして、複雑なタイプのものには作用しないようにすることができます。

Type.IsPrimitiveを使用して、指定された型がプリミティブかどうかを確認できますが、ここで十分にカバーされている落とし穴がいくつかあります。

https://stackoverflow.com/a/2442544/141172

于 2013-03-20T23:31:33.053 に答える