2016-09-09 7 views
1

プロパティを多く含むビューモデルがあり、hubspotに特定の命名規則が必要であるため、データをhubspotに送信するためのカスタム属性を作成しました。ビューモデルからすべてのプロパティを取得して配列に表示する

public class CreateTrialUserHubspotViewModel { 

    [HubspotAttribute("firstname")] 
    [Display(Name = "First Name")] 
    [StringLength(50)] 
    [Required] 
    public string FirstName { get; set; } 

    [HubspotAttribute("lastname")] 
    [Display(Name = "Last Name")] 
    [StringLength(50)] 
    [Required] 
    public string LastName { get; set; } 

    [HubspotAttribute("jobtitle")] 
    [Display(Name = "Job title")] 
    [StringLength(50)] 
    [Required] 
    public string JobTitle { get; set; } 
} 

さて、これは私のカスタム属性

[AttributeUsage(AttributeTargets.All)] 
public class HubspotAttribute : System.Attribute { 
    public readonly string hubspotValue; 

    public HubspotAttribute(string value) 
    { 
     this.hubspotValue = value; 
    } 
} 

です:彼は特定の出力を入れて、私のカスタム属性が含まれているすべてのプロパティのために、ここにコードがあるとイテレータのいくつかの王を持っている方法を、作成そして、私はviewmodelオブジェクトとcreaを取るメソッドを作成する必要がありますTE私の出力、私はこのようなものになり、いくつかはそれを行う方法について提案する必要があります。

private static RowValidation ValidateRowWithManifest<T>(CreateTrialUserHubspotViewModel trialUser) { 
     RowValidation validation = new RowValidation(); 

     FieldInfo[] fields = typeof(T).GetPropertiesOfSomeWay; 

     foreach (DataType field in fields) { 
      output+=whatINeed 
     } 
     return validation; 
    } 
} 

が必要な出力は次のようになります:[FIRSTNAME:姓「ペペ」、=「ペレス」、jobtitle」なし"]。そのメソッドを呼び出すだけで、必要なすべてのデータが返されます。あなたはは、JSON文字列のようなに見えるという文字列にプロパティを連結します何かを探しています(そしてそれは、それを処理するためのより良い方法だろう)場合

+1

あなたのデータ出力は意味をなさない。コロンは記号と等しく、キー/値のペアはありません。実際に必要なのは何ですか? –

+0

私はより良い説明をする、私は名前を持っているプロパティを持っていますが、私はすべての小道具のために必要な正確な名前を持っているので、viewmodelオブジェクトを期待するメソッドを必要とするカスタムattrを追加しましたprop.customattr + ":" + viewModelObject.valueであるすべての小道具の文字列を作成します。あなたが今理解したら教えてください –

答えて

0

は、次のようなものを使用することができます。

private static string CreateOutput(CreateTrialUserHubspotViewModel trialUser) 
{ 
    var properties = trialUser.GetType().GetProperties().Where(x => Attribute.IsDefined(x, typeof(HubspotAttribute))).ToList(); 

    var values = properties.Select(x => 
    { 
     var att = x.GetCustomAttribute(typeof(HubspotAttribute)); 
     var key = ((HubspotAttribute)att).hubspotValue; 
     var val = x.GetValue(trialUser); 
     return $"{key}:{val}"; 
    }); 

    var sb = new StringBuilder(); 
    values.ToList().ForEach(v => 
    { 
     sb.Append(v); 
     if (values.Last() != v) sb.Append(','); 
    }); 

    return sb.ToString(); 
} 
+0

ええ、そういうもの、ありがとう。私はC#で新しいです。私は再び、tyのJavaの男になるために使用します。 –

+0

@ dayanrr91問題ありません。私が言ったように、あなたのマイレージはJSONシリアライゼーションを調べることで改善されるかもしれませんが、これで少なくともあなたが必要とするものを始められるでしょう:)。 –

1
public string GetString<T>(T @object) 
     { 
      var output = new StringBuilder(); 
      var type = typeof(T); 
      var properties = type.GetProperties(); 
      foreach (var property in properties) 
      { 
       var attributes = property.GetCustomAttributes(typeof(HubspotAttribute), true); 
       if (attributes.Length == 0) 
        continue; 

       var name = ((HubspotAttribute)attributes[0]).hubspotValue; 
       var value = property.GetValue(@object) ?? "none"; 
       output.AppendFormat("{0}:\"{1}\",", name, value); 
      } 

      var fields = output.ToString().TrimEnd(','); 
      return string.Format("[{0}]", fields); 

     } 
+0

thx、すてきなコード、非常にきれい、私はあなたのソリューションが好きです –

+0

は十分に一般的ではなく、あなたは特定のHubspotAttributeに縛られています –

+1

私は何を考えましたか? https://xkcd.com/974/ –

関連する問題