Заполните свойства, украшенные атрибутом - PullRequest
0 голосов
/ 25 марта 2010

Существуют ли какие-либо структуры, которые помогают мне в этом: (думая, что, возможно, мне поможет StructureMap)

Всякий раз, когда я создаю новый экземпляр «MyClass» или любого другого класса, который наследует от IMyInterface, я хочу, чтобы все свойства, украшенные [MyPropertyAttribute], заполнялись значениями из базы данных или некоторого другого хранилища данных, используя свойство Name в атрибуте .

public class MyClass : IMyInterface
{
    [MyPropertyAttribute("foo")]
    public string Foo { get; set; }
}

[AttributeUsage(AttributeTargets.Property)]
public sealed class MyPropertyAttribute : System.Attribute
{
    public string Name
    {
        get;
        private set;
    }

    public MyPropertyAttribute(string name)
    {
        Name = name;
    }
}

Ответы [ 2 ]

0 голосов
/ 25 марта 2010

Проверьте следующие рамки из codeplex: http://www.codeplex.com/AutoMapper для картирования и http://fasterflect.codeplex.com/ для быстрого отражения, чтобы собрать ваши свойства и значения или значения get.

0 голосов
/ 25 марта 2010

Вместо этого используйте абстрактный класс (или фабричный шаблон, если вы настаиваете на интерфейсе).

С помощью абстрактного класса вы можете просто сделать необходимое заполнение в конструкторе по умолчанию с небольшим размышлением.

Что-то вроде:

abstract class Base
{
  protected Base()
  {
    var actualtype = GetType();
    foreach (var pi in actualtype.GetProperties())
    {
      foreach (var attr in pi.GetCustomAttributes(
         typeof(MyPropertyAttribute), false))
      {
        var data = GetData(attr.Name); // get data
        pi.SetValue(this, data, null);
      }
    }
  }
}

Отказ от ответственности: Код может не скомпилироваться, я только что написал его из головы.

...