Я пытаюсь создать объект с помощью атрибута свойства классов, который указывает столбец в предоставленной строке данных, который является значением свойства, как показано ниже:
[StoredDataValue("guid")]
public string Guid { get; protected set; }
[StoredDataValue("PrograGuid")]
public string ProgramGuid { get; protected set; }
В методе Build () базового объекта я получаю значения атрибутов, установленные для этих свойств как
MemberInfo info = GetType();
object[] properties = info.GetCustomAttributes(true);
Однако на данный момент я осознаю ограниченность своих знаний.
Во-первых, мне кажется, что я не получаю обратно правильные атрибуты.
И как мне установить эти свойства через отражение, теперь, когда у меня есть атрибуты? Я делаю / думаю что-то в корне неверное?





Здесь есть пара отдельных вопросов
typeof(MyClass).GetCustomAttributes(bool) (или GetType().GetCustomAttributes(bool)) возвращает атрибуты самого класса, а не атрибуты членов. Вам нужно будет вызвать typeof(MyClass).GetProperties(), чтобы получить список свойств в классе, а затем проверить каждое из них.
Как только вы получили свойство, я думаю, вам следует использовать Attribute.GetCustomAttribute() вместо MemberInfo.GetGustomAttributes(), поскольку вы точно знаете, какой атрибут вы ищете.
Вот небольшой фрагмент кода, который поможет вам начать:
PropertyInfo[] properties = typeof(MyClass).GetProperties();
foreach(PropertyInfo property in properties)
{
StoredDataValueAttribute attribute =
Attribute.GetCustomAttribute(property, typeof(StoredDataValueAttribute)) as StoredDataValueAttribute;
if (attribute != null) // This property has a StoredDataValueAttribute
{
property.SetValue(instanceOfMyClass, attribute.DataValue, null); // null means no indexes
}
}
РЕДАКТИРОВАТЬ: Не забывайте, что Type.GetProperties() по умолчанию возвращает только общедоступные свойства. Вам придется использовать Type.GetProperties(BindingFlags), чтобы получить и другие свойства.
Attribute.GetCustomAttribute (...) возвращает массив System.Attribute и не может быть просто приведен к самому атрибуту. Показанный пример даже не компилируется, не говоря уже о работе. Вам нужно проверить длину массива, чтобы увидеть, существует ли желаемый атрибут, и вместо этого привести первый элемент к требуемому типу.
В примере используется GetCustomAttribute, а не GetCustomAttributes. Пример компилируется, когда я его пробую (конечно, меняя имя атрибута).
Я провожу это испытание и дам вам знать, хотя выглядит логично