如何基于自定义属性从集合动态创建对象?

时间:2019-05-19 13:40:42

标签: c#

我必须基于自定义属性从对象集合中创建动态对象。

public class Customer
{
    [AccountAttribute(name: "CustomerAccountID")]        
    public int CustomerID { get; set; } 

    [RoleAttribute(name: "RoleUserID")]
    [AccountAttribute(name: "AccountRole")]        
    public int RoleID { get; set; }

}

我有一个客户数据列表

var custData = GetCustomerData();

我要根据属性过滤“客户”集合。

如果我基于AccountAttribute进行过滤,则我希望有CustomerID和RoleID的列表,并且在新创建的列表中,属性名称应为CustomerAccountID,AccountRole。

如果基于RoleAttribute进行过滤,则仅需要RoleID,并且字段名称应为RoleUserID。

以上类仅是一个示例,有20多个字段可用,并具有三个不同的属性。

某些字段属于单个属性,但有些字段属于多个属性。

1 个答案:

答案 0 :(得分:2)

在编译时不知道属性名称的情况下,创建动态对象的最佳方法是ExpandoObject-它使您可以使用IDictionary<string, object>界面访问对象,因此您只需要做的就是添加适当的键值对:

private static dynamic CustomerToCustomObject<TAttribute>(Customer customer) 
    where TAttribute : BaseAttribute // assuming the Name property is on a base class for all attributes
{
    dynamic result = new ExpandoObject();
    var dictionary = (IDictionary<string, object>)result;

    var propertiesToInclude = typeof(Customer).GetProperties()
        .Where(property => property.GetCustomAttributes(typeof(TAttribute), false).Any());
    foreach (var property in propertiesToInclude)
    {
        var attribute = (BaseAttribute)(property.GetCustomAttributes(typeof(TAttribute), false).Single());
        dictionary.Add(attribute.Name, property.GetValue(customer));
    }
    return result;
}