添加自定义属性并从动态对象获取属性

时间:2019-03-18 19:27:13

标签: c# asp.net reflection

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

因此,如果我有模型,可以说用户:

public static void main(String[] args) {
    DoublyLinkedList<Integer> list = new DoublyLinkedList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    System.out.println(list.toString()); // [1, 2, 3]
}

因此,如果用户不想包括[Sheet] public class User { [Column] public string FirstName { get; set; } [Column] public string LastName { get; set; } [Column] public string EmailAddress { get; set; } } 字段,则在导出引擎尝试执行EmailAddress来处理属性名称及其对excel的值时,应排除此字段。

我尝试使用model.GetType().GetProperties(),但是当我尝试通过ExpandoObject访问属性时,即使我已经将整个model.GetType().GetProperties()传递给PropertyInfo,也无法使用值。

如何使用动态功能?仅供参考,自定义属性将被导入以包含在对象及其属性中,因为存在使用这些属性进行过滤以进一步处理模型类的情况。

更新

此对象是通用的IDictionary<string, object>,例如,可以将其IList导出到excel。

1 个答案:

答案 0 :(得分:0)

我相信您正在问如何从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上查看我的示例。