MetadataType和Attribute.IsDefined

时间:2019-02-17 13:54:14

标签: c# reflection custom-attributes metadatatype

我正在使用数据库优先方法,并且有一个类SalesWallboard映射到数据库表。

SalesWallboard.cs:

between_two_lists

我为此创建了一个MetadataType类以应用自定义属性

SalesWallboardModel.cs

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

但是在我的代码中,当我使用Attribute.IsDefined检查它时,它总是抛出false。

代码

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

    }

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

我已经检查了here给出的答案。但是我不明白这个例子。 有人可以为我简化一下吗?

1 个答案:

答案 0 :(得分:0)

我要感谢@elgonzo和@thehennyy的评论,并通过反思来纠正我的理解。

我找到了想要的here。但是我必须进行如下所示的一些修改。

我创建了方法// Select DOM Items const menuBtn = document.querySelector(".menu-btn"); const menu = document.querySelector(".menu"); const menuNav = document.querySelector(".menu-nav"); const menuBranding = document.querySelector(".menu-branding"); const navItem = document.querySelectorAll(".nav-item"); // Set Initial state of the menu let showMenu = false; menuBtn.addEventListener("click", toggleMenu); function toggleMenu() { // Opens the navigation bar if (!showMenu) { menuBtn.classList.add("close"); menu.classList.add("show"); menuNav.classList.add("show"); menuBranding.classList.add("show"); navItem.forEach(item => item.classList.add("show")); // Set Menu state to true showMenu = true; } // Closes the navigation bar else { menuBtn.classList.remove("close"); menu.classList.remove("show"); menuNav.classList.remove("show"); menuBranding.classList.remove("show"); navItem.forEach(item => item.classList.remove("show")); // Set Menu state to false showMenu = false; } }

PropertyHasAttribute

我也从here获得了帮助,因为我的类型在另一个程序集中。

方法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;
}