首页 > 解决方案 > 添加自定义属性并从动态对象获取属性

问题描述

我有这种情况,我们使用模型类来生成一个 excel 文件,但是由于新的请求,它需要处理包含 excel 文件代码生成器必须处理的属性的动态对象。

因此,如果我有模型,假设用户:

[Sheet]
public class User 
{
    [Column]
    public string FirstName { get; set; }

    [Column]
    public string LastName { get; set; }

    [Column]
    public string EmailAddress { get; set; }
}

因此,如果用户不想包含该字段,则在导出引擎尝试将属性名称及其值处理到 excelEmailAddress时应将其排除。model.GetType().GetProperties()

我尝试使用,ExpandoObject但是当我尝试访问属性时它不起作用,model.GetType().GetProperties()即使我已将整体传递PropertyInfoIDictionary<string, object>值。

我如何使用动态来做到这一点?仅供参考,自定义属性被导入作为对象的一部分,它是属性,因为使用这些属性进行过滤以进一步处理模型类。

更新

这个对象是通用IList的,例如它可以是IList<User>因为它是数据导出到 excel。

标签: c#asp.netreflection

解决方案


我相信您在问如何从 ExpandoObject 检索所有“属性”(动态成员)。您所要做的就是迭代它。

public static void Main()
{
    dynamic d = new ExpandoObject();

    d.Foo = "Hello";

    Console.WriteLine("Should have one  property:");

    foreach (var i in d )
    {
        Console.WriteLine("Name: {0} Type: {1} Value: {2}", i.Key, i.Value.GetType().Name, i.Value);
    }

    Console.WriteLine("\r\nShould have two properties:");

    d.Bar = 123.45F;

    foreach (var i in d)
    {
        Console.WriteLine("Name: {0} Type: {1} Value: {2}", i.Key, i.Value.GetType().Name, i.Value);
    }
}

输出:

Should have one  property:
Name: Foo Type: String Value: Hello

Should have two properties:
Name: Foo Type: String Value: Hello
Name: Bar Type: Single Value: 123.45

请参阅我在DotNetFiddle上的示例。


推荐阅读