控制返回反射属性值的顺序的最佳方法是什么?

时间:2009-12-23 14:01:46

标签: c# reflection

我有一个继承另一个的类。我想使用反射循环遍历属性并将值写入文件。没问题。除了我想控制属性写出的顺序。有干净的方法吗?现在,问题1是子类中的属性写出来,然后父类中的proepries写出来。但是,我可能想跳过一些属性或只是重新排序。

现在是我的代码......

foreach (PropertyInfo bp in t.GetProperties())
{
    Type pt = bp.PropertyType;

    if ((pt.IsArray) && pt.FullName == "System.Char[]")
    {
        char[] caPropertyValue;
        caPropertyValue = (char[])(bp.GetValue(oBatch, null));
        string strPropertyValue = new string(caPropertyValue);
        myBatch.Add(strPropertyValue);
    }
}

3 个答案:

答案 0 :(得分:3)

最简单的方法是按名称命名 - 按字母顺序排列。您也可以按照它们所属的类对它们进行分组,然后按名称对每个组进行排序。 LINQ使这些操作相对容易:

foreach( PropertyInfo bp in t.GetProperties()
                             .OrderBy( p => p.Name ) 
{...}

foreach( PropertyInfo bp in t.GetProperties()
                             .OrderBy( p => p.Name )
                             .GroupBy( p => p.DeclaringType.FullName )
                             .OrderBy( g => g.Key )
                             .SelectMany( g => g ) )
{...}

答案 1 :(得分:1)

您可以创建自己的属性,即'''OrderAttribute'''并将其放在属性上 比如

public class Man
{
   [Order(0)]
   string Name {get; set;}
   [Order(1)]
   int virtual Age {get; set;}
}
public class SuperMan:Man
{
   [Order(-1)]
   override int Age {get; set;}
}

在排序例程中,您可以通过pi.GetCustomAttribute()检查订单属性值,并对其进行排序。

答案 2 :(得分:0)

查看GetProperties语法。有一个参数告诉它你是否只想要当前类的属性,或者正如你所要求的那样,是整个继承链的属性。你必须走你的类结构来找到每个级别的属性。