我正在编写一个解析器来设置对象的属性,并寻找更好的方法来解决问题。我将发布简短的例子,普通的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数组访问方法的方法。
如果您对我的问题提出建议或对我的代码提出其他建议,我会很高兴=)
亲切的问候