如何从一个类提取数据注释并将其复制到另一个类(属性集合)

时间:2012-03-20 15:46:24

标签: .net asp.net-mvc reflection data-annotations

我在使用反射,DataAnnotations和asp.mvc时遇到了问题。

我已经定义了界面:

public interface IFoo
{
    string Name { get; set; }
}

然后我创建实现这些接口的类并添加更多属性:

public class a : IFoo
{
    public string Name { get; set; }

    [MaxLength(50)]
    public string P1 { get; set; }
}

public class b: IFoo
{
    public string Name { get; set; }

    [Required]
    [MaxLength(100)]
    public string P2 { get; set; }
}

//应该存储a或b类提取属性的附加类。

public class AdditionalProperty
{
    public string Name { get; set }

    public string Value { get; set }
}

正如您所看到的,DataAnnotations属性还有一些其他属性。

所以问题是如何使用DataAnnotations元数据创建其他属性的集合?。

我期待以下结果:

对于班级a => ICollection = {{Name =“P1”,Value = null}} //但是Value属性应该具有属性P1的DataAnnotations。

对于班级b => ICollection = {{Name =“P2”,Value = null}} //但是Value属性应该具有属性P2的DataAnnotations。

需要在asp.mvc中创建一个模型,并通过验证,例如:

public class aspMvcModel
{
    public ICollection<AdditionalProperty> ListOfProperties { get; set; }
}

然后我可以使用这个模型类在asp.mvc视图上显示表单。

-

我知道如何提取属性列表,我知道如何只选择每个类的唯一属性(简化代码):

var classToScan = new a();
var properties = classToScan.GetType().GetProperties()

但我不知道如何将数据注释从一个类“复制”到AdditionalProperty类的集合。

任何想法?。

1 个答案:

答案 0 :(得分:0)

我无法理解您的确切问题是什么,但如果您想获取所有数据注释,则可以使用以下代码。仍然可以提到你确切的问题。

var metaData = ModelMetadataProviders.Current.GetMetadataForType(null, Type.GetType("namespace.a"));
            IDictionary<string, object> validationAttributes = helper.GetUnobtrusiveValidationAttributes("P1", metaData);