web-dev-qa-db-ja.com

クラスオブジェクトを文字列に変換するにはどうすればよいですか?

Webサービス(WCF)経由のクラスオブジェクトがあります。このクラスには、String型のプロパティといくつかのカスタムクラス型があります。

カスタムクラスタイプのプロパティのプロパティ名とプロパティ名を取得するにはどうすればよいですか。

GetProperies()を使用してリフレクションを試みましたが、失敗しました。プロパティタイプが文字列タイプである場合、GetFields()は成功しました。カスタムタイププロパティのプロパティも取得したいです。

これが私のコードです。

public static string ToClassString(this object value)
{
    if (value == null)
        return null;
    var builder = new StringBuilder();
    builder.Append(value.GetType().Name + "{ ");
    foreach (var prop in value.GetType().GetFields(
BindingFlags.Public
| BindingFlags.Static | BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.GetProperty))
    {
        builder.Append("{ ");
        builder.Append(prop.Name + " , ");
        switch (prop.FieldType.Namespace)
        {
            case "System":
                builder.Append(prop.GetValue(value) + " }");
                break;
            default:
                builder.Append(prop.GetValue(value).ToClassString() + " }");
                break;
        }
    }
    builder.Append("}");
    return builder.ToString();
}

私は次のような出力を得ました

NotifyClass {{UniqueId、16175} {NodeInfo、NodeInfo {}} {EventType、SAPDELETE}}

これは、インスタンスを文字列に変換するクラスです

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="NotifyReq", WrapperNamespace="wrapper:namespace", IsWrapped=true)]
public partial class Notify
{

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="custom:namespace", Order=0)]
    public int UniqueId;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="custom:namespace", Order=1)]
    public eDMRMService.NodeInfo NodeInfo;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="custom:namespace", Order=2)]
    public string EventType;

    public Notify()
    {
    }

    public Notify(int UniqueId, eDMRMService.NodeInfo NodeInfo, string EventType)
    {
        this.UniqueId = UniqueId;
        this.NodeInfo = NodeInfo;
        this.EventType = EventType;
    }
}        
14
Kishore Kumar

車輪を再発明する必要はありません。 Json.Net を使用します

string s = JsonConvert.SerializeObject(yourObject);

以上です。

JavaScriptSerializerを使用することもできます

string s = new JavaScriptSerializer().Serialize(yourObject);
57
I4V