C#尽可能快地动态访问对象的属性

时间:2014-03-09 14:30:49

标签: c# arrays properties

我正在编写一个解析器来设置对象的属性,并寻找更好的方法来解决问题。我将发布简短的例子,普通的Segments有更多的属性(这就是为什么我搜索一种有效的解析方法)。

我有来自类ASegment的段。

abstract class ASegment
{
    public Field[] Properties { get; set; }

    public string this[int index]
    {
        get
        {
            if (index >= Properties.Length) return "";
            PropertyInfo prop = GetType().GetProperty(Properties[index].Name);
            return (string)prop.GetValue(this);
        }
        set
        {
            PropertyInfo prop = GetType().GetProperty(Properties[index].Name);
            prop.SetValue(this, value);
        }
    }
}

class ExampleSegment: ASegment
{
    public ExampleSegment()
    {
        Properties = new[]
        {
            new Field("Field1",20), //A Field represents different options
            new Field("Field2",10),//For example the Name of the Property
            new Field("Field3",10) //and MaxLength, Repeatable, etc (not needed for my problem, 
                                   // except you know a better way to solve this :)
        };
    }
    public string Field1{ get; set; }
    public string Field2{ get; set; }
    public string Field3{ get; set; }
}

现在这是我解析消息的方式:

 string text ="ExampleSegment|f2|f3";
 string[] segmentMessage = text.Split('|');
 //I access the right Segment through Reflection. The First part of the Message is always the Segment name.
 ASegment segment = Assembly.GetExecutingAssembly().CreateInstance(Namespace+segmentMessage[0]) as ASegment;
 for (int i = 0; i < segment.Properties.Length; i++)
 {
      if (i < segmentMessage.Length && segmentMessage[i] != null)
          segment[i] = segmentMessage[i];//Here i set the Value
 }

一切正常,但我认为这个解决方案并不是很好。

问题1:每次我创建一个段时,构造函数还会创建一个属性数组的新实例。 当我在ASegment中使属性数组静态,并在带有public new static ...的ExampleSegment中创建它时,我无法通过ASegment访问属性列表。

问题:是否有一种访问和创建此静态数组的好方法。

问题2:我认为有更好或更快的方式来访问ExampleMessage类的属性。例如,我可以使用Actions而不是Property的名称来访问Property。

问题:是否可以通过System.Action访问属性?我只找到了一种通过System.Action数组访问方法的方法。

如果您对我的问题提出建议或对我的代码提出其他建议,我会很高兴=)

亲切的问候

0 个答案:

没有答案