2016-09-09 4 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: «Pepe», фамилия = «перес», jobtitle "никто «]. просто вызов этого метода вернет все нужные мне данные.

+1

Ваш вывод данных даже не имеет смысла. У вас есть двоеточия, равные знакам и не представляющие пары ключ/значение. Что вам на самом деле нужно? –

+0

Позвольте мне лучше объяснить, у меня есть свойства, у которых есть имена (конечно), но я добавил некоторые пользовательские attr для того, чтобы иметь точное имя, которое мне нужно для каждой опоры, поэтому мне нужен метод, который ожидает объект viewmodel, тогда он постройте строку для каждой опоры, которая будет prop.customattr + ":" + viewModelObject.value. скажите мне, если теперь вы поймете лучше. –

ответ

0

Если вы ищете что-то, что будет CONCATENATE свойства в строку, которая выглядит как строка JSON (и это будет лучший способ справиться с этим), вы можете использовать что-то вроде следующего:

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#. Я использую быть 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/ –