2016-09-09 3 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를 취하는 메소드를 생성해야합니다. 테 내 출력, 나는 이런 식으로 뭔가있을 것입니다, 일부는 그 작업을 수행하는 방법에 대한 제안이 필요합니다

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 : LASTNAME "페페"= "페레즈", jobtitle "없음 "]. 이 메서드를 호출하면 필요한 모든 데이터가 반환됩니다. 당신이 는 JSON 문자열처럼을 보이는 것을 문자열로 속성을 연결합니다 뭔가를 찾고있다 (그리고 그것을 처리하는 더 좋은 방법이 될 것이다) 경우

+1

데이터 출력이 의미가 없습니다. 콜론은 부호가 같고 키/값 쌍을 나타내지 않습니다. 실제로 필요한 것은 무엇입니까? –

+0

내가 더 잘 설명하고, 속성을 가지고 있는데, 이름을 가지고있다. (물론) 이름을 가지고 있지만, 모든 prop에 꼭 필요한 정확한 이름을 가진 attr을 추가했다. 그래서 나는 viewmodel 객체를 기대하는 메소드를 필요로한다. 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, 자바 녀석으로 사용합니다. –

+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

좋은 코드, 매우 깨끗한, 내가 당신의 솔루션을 좋아한다 –

+0

충분히 일반 적이 지 않다. 특정 HubspotAttribute에 묶여있다. –

+1

나는 무엇을 생각하고 있었 을까? https://xkcd.com/974/ –