C # работает с оформленными членами - PullRequest
2 голосов
/ 30 апреля 2010

Возьмите этот класс, например:

public class Applicant : UniClass<Applicant>
{
    [Key]
    public int Id { get; set; }

    [Field("X.838.APP.SSN")]
    public string SSN { get; set; }

    [Field("APP.SORT.LAST.NAME")]
    public string FirstName { get; set; }

    [Field("APP.SORT.FIRST.NAME")]
    public string LastName { get; set; }

    [Field("X.838.APP.MOST.RECENT.APPL")]
    public int MostRecentApplicationId { get; set; }
}

Как мне получить все свойства, которые украшены атрибутом поля, получить их типы и назначить им значение?

Ответы [ 3 ]

4 голосов
/ 30 апреля 2010

Это все сделано с отражением. Когда у вас есть объект Type, вы можете получить его PropertyInfo с myType.GetProperties(), оттуда вы можете получить атрибуты каждого свойства с GetCustomAttributes(), и если вы найдете свой атрибут, вы получите победителя, и тогда вы можете приступить к работе с ним, как вам угодно.

У вас уже есть объект PropertyInfo, поэтому его можно назначить с помощью PropertyInfo.SetValue(object target, object value, object[] index)

2 голосов
/ 30 апреля 2010

Вам нужно будет использовать Reflection:

var props =
   from prop in typeof(Applicant).GetProperties()
   select new {
      Property = prop,
      Attrs = prop.GetCustomAttributes(typeof(FieldAttribute), false).Cast<FieldAttribute>()
   } into propAndAttr
   where propAndAttr.Attrs.Any()
   select propAndAttr;

Затем можно выполнить итерацию по этому запросу, чтобы установить значения:

foreach (var prop in props) {
   var propType = prop.Property.PropertyType;
   var valueToSet = GetAValueToSet(); // here's where you do whatever you need to do to determine the value that gets set
   prop.Property.SetValue(applicantInstance, valueToSet, null);
}
1 голос
/ 30 апреля 2010

Вам просто нужно вызвать соответствующие методы отражения - попробуйте это:

<MyApplicationInstance>.GetType().GetProperties().Where(x => x.GetCustomAttributes().Where(y => (y as FieldAttribute) != null).Count() > 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...