0

我有一些关于MetadataType的问题/疑问。我有 DLL helper-project 用于使用 LinqToSQL 从 MS SQL Server 进行数据访问。我还需要为生成的类 ClientInfoView 添加元数据。我已经按照以下方式完成了:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;

namespace DataAPI.LINQToSQL
{
    [MetadataType(typeof(ClientInfoViewMetaData))]
    public partial class ClientInfoView
    {
        internal sealed class ClientInfoViewMetaData
        {
            [Category("Main Data"), DisplayName("Client ID")]
            public int ID { get; set; }

            [Category("Main Data"), DisplayName("Login")]
            public string Login { get; set; }

            ...
        }
    }
}

但是当我在运行时检查属性时,我发现 ClientInfoView 没有任何属性。

你能帮我找出错误吗?

4

3 回答 3

3

因为元数据类型不适用于此类情况,但您可以使用此方法

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

你可以像这样使用

bool res = PropertyHasAttribute<ClientInfoView>("Login", typeof(DisplayAttribute))

这告诉您类属性 login 有或没有 displayattribute ,但是如果您需要找出属性 Value ,您可以使用 Attribute.GetCustomAttribute 方法并将其转换为您选择的属性,如显示属性并通过 .Name 读取 Name 属性:)

于 2014-07-15T11:51:02.750 回答
1

要给出部分答案,您可以检查 ClientInfoView 是否具有属性。一些对我有用的小演示。仍在尝试找出为什么我无法在 ClientInfoViewMetaData 单个属性中访问这些属性

    static void Main(string[] args)
    {
        TypeDescriptor.AddProviderTransparent(
        new AssociatedMetadataTypeTypeDescriptionProvider(typeof(ClientInfoView), typeof(ClientInfoViewMetaData)), typeof(ClientInfoView));
        ClientInfoView cv1 = new ClientInfoView() { ID = 1 };
        var df = cv1.GetType().GetCustomAttributes(true);
        var dfd = cv1.ID.GetType().GetCustomAttributes(typeof(DisplayNameAttribute), true);
        var context = new ValidationContext(cv1, null, null);
        var results = new List<ValidationResult>();
        var isValid = Validator.TryValidateObject( cv1,context, results, true);
    }
}

    [MetadataType(typeof(ClientInfoViewMetaData))]
    public partial class ClientInfoView
    {
        public int ID { get; set; }
        public string Login { get; set; }
    }

public class ClientInfoViewMetaData
{        
    [Required]
    [Category("Main Data"), DisplayName("Client ID")]
    public int ID { get; set; }

    [Required]
    [Category("Main Data"), DisplayName("Login")]
    public string Login { get; set; }

}
于 2013-07-26T06:50:28.553 回答
0

或者您可以使用基于 elia07 答案的扩展方法:

<System.Runtime.CompilerServices.Extension>
Public Function HasAttribute(Of TABLEENTITY, ATTRTYPE)(md As ModelMetadata) As Boolean
    Dim properyName As String = md.ContainerType.GetProperty(md.PropertyName).ToString()

    Dim att As MetadataTypeAttribute = DirectCast(Attribute.GetCustomAttribute(GetType(TABLEENTITY), GetType(MetadataTypeAttribute)), MetadataTypeAttribute)
    If att IsNot Nothing Then
        For Each prop In Type.[GetType](att.MetadataClassType.UnderlyingSystemType.FullName).GetProperties()
            If properyName.ToLower() = prop.Name.ToLower() AndAlso Attribute.IsDefined(prop, GetType(ATTRTYPE)) Then
                Return True
            End If
        Next
    End If

    Return False
End Function

一个样品:

 Dim md As ModelMetadata = ...
 Dim isReadOnly As Boolean = md.HasAttribute(Of Cikkek, ReadOnlyFW)
于 2016-01-09T11:54:06.260 回答