MetadataType и Attribute.IsDefined - PullRequest
       57

MetadataType и Attribute.IsDefined

0 голосов
/ 17 февраля 2019

Я использую первый подход к базе данных, и класс SalesWallboard сопоставлен с таблицей базы данных.

SalesWallboard.cs:

namespace Wallboards.DAL.SchnellDb
{
    public partial class SalesWallboard
    {
        public int Id { get; set; }
        public string StaffName { get; set; }
        ...
    }
}

Я создалКласс MetadataType для этого применяет пользовательские атрибуты

SalesWallboardModel.cs

namespace Wallboards.DAL.SchnellDb
{
    [MetadataType (typeof(SalesWallboardModel))]
    public partial class SalesWallboard
    {

    }

    public class SalesWallboardModel
    {
        [UpdateFromEclipse]
        public string StaffName { get; set; }
        ...
    }
}

Но в моем коде, когда я проверяю его с помощью Attribute.IsDefined, он всегда выдает false.

Код

var salesWallboardColumns = typeof(SalesWallboard).GetProperties();
foreach (var column in salesWallboardColumns)
{
    if (Attribute.IsDefined(column, typeof(UpdateFromEclipse))) //returns false
    {
        ...
    }
}

Я проверил ответ, данный здесь .Но я не понимаю пример.Может кто-нибудь, пожалуйста, упростить это для меня?

1 Ответ

0 голосов
/ 17 февраля 2019

Я хотел бы поблагодарить @elgonzo и @thehennyy за их комментарии и исправление моего понимания с помощью размышлений.

Я нашел то, что искал здесь .Но мне пришлось сделать несколько модификаций, показанных ниже.

Я создал метод PropertyHasAttribute

private static bool PropertyHasAttribute<T>(string propertyName, Type attributeType)
{
    MetadataTypeAttribute att = (MetadataTypeAttribute)Attribute.GetCustomAttribute(typeof(T), typeof(MetadataTypeAttribute));
    if (att != null)
    {
        foreach (var prop in GetType(att.MetadataClassType.UnderlyingSystemType.FullName).GetProperties())
        {
            if (propertyName.ToLower() == prop.Name.ToLower() && Attribute.IsDefined(prop, attributeType))
                return true;
        }
    }
    return false;
}

Я также получил помощь от здесь , потому что мой тип был вдругая сборка.

Метод GetType

public static Type GetType(string typeName)
{
    var type = Type.GetType(typeName);
    if (type != null) return type;
    foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
    {
        type = a.GetType(typeName);
        if (type != null)
            return type;
    }
    return null;
}

Затем использовал его в моем коде, например, так:

Код

var salesWallboardColumns = typeof(SalesWallboard).GetProperties();
foreach (var column in salesWallboardColumns)
{
    var columnName = column.Name;
    if (PropertyHasAttribute<SalesWallboard>(columnName, typeof(UpdateFromEclipse)))
    {
        ...
    }
}
...