我有一个基础课
abstract public class containerClass {
protected containerClass () {
// do stuff
}
virtual protected void parseData() {
// do the stuff I'm mentioning later
}
}
和儿童班
public class childClassOne : containerClass {
public childClassOne () : base () {
var1S = "99";
var2S = "88.3";
var3S = "2015-04-22T15:55:25.2625065-07:00";
}
public int var1 {get; protected set;}
public double var2 {get; protected set;}
public DateTime var3 {get; protected set;}
public string var1S {get; protected set;}
public string var2S {get; protected set;}
public string var3S {get; protected set;}
}
和
public class childClassTwo : containerClass {
public childClassTwo () : base () {
var1S = "99.22";
var2S = "88.3";
var3S = "43.44";
}
public double var1 {get; protected set;}
public double var2 {get; protected set;}
public double var3 {get; protected set;}
public string var1S {get; protected set;}
public string var2S {get; protected set;}
public string var3S {get; protected set;}
}
我想做的是在父类中定义parseData,以在子类调用它时遍历属性,并解析字符串以获取相关数据。
订单需要保留。字符串可能是外部数据,而不是这些类的属性或字段。
我目前在伪代码中的想法是这样的:
for (property prop in thisClass)
{
typeof(prop) temp;
if (typeof(prop).tryParse(var1S, temp))
prop = temp;
}
我正在查看的所有类都有一个带有两个输入变量的tryParse方法。我想做的工作可以吗?如果是这样,我如何以明确的顺序遍历属性?
简单的?号可能吗?是的。
我想做的是在父类中定义parseData,以在子类调用它时遍历属性,并解析字符串以获取相关数据。
以下是问题的第一部分。这是个小玩意儿。
virtual protected void parseData()
{
// iterate through the properties when it's called by a child class
foreach(var p in this.GetType().GetProperties())
{
// and parse the strings for relevant data
var propName = p.Name;
var propValue = p.GetValue(this);
Console.WriteLine(string.Format("{0} = {1}", propName, propValue));
}
}
订单需要保留。
这不再是简单的地方。MSDN说: “不能保证返回的集合的顺序在调用之间是相同的。”
这个问题“ Type.GetProperties”属性顺序有一个答案,建议使用自定义属性来保留顺序。可能看起来像这样:
[System.AttributeUsage(System.AttributeTargets.Property)]
public class ProperyOrderAttribute : System.Attribute
{
public int Order { get; private set; }
public ProperyOrderAttribute(int order)
{
this.Order = order;
}
}
您将在属性上使用它。
[ProperyOrderAttribute(0)]
public int var1 { get; protected set; }
您可以像这样比较它:
protected Comparison<PropertyInfo> comparer = (x,y) => {
var type = typeof(ProperyOrderAttribute);
var xAttr = x.GetCustomAttributes(type, false);
var yAttr = y.GetCustomAttributes(type, false);
var xOrder = xAttr.Count() > 0 ?
(xAttr[0] as ProperyOrderAttribute).Order :
Int64.MaxValue;
var yOrder = yAttr.Count() > 0 ?
(yAttr[0] as ProperyOrderAttribute).Order :
Int64.MaxValue;
return xOrder.CompareTo(yOrder);
};
这是parseData()
保留顺序的最终方法的工作方式:
virtual protected void parseData()
{
var properties = this.GetType().GetProperties();
// maintain the order
Array.Sort(properties, comparer);
// iterate through the properties when it's called by a child class
foreach (var p in properties)
{
// and parse the strings for relevant data
var propName = p.Name;
var propValue = p.GetValue(this);
Console.WriteLine(string.Format("{0} = {1}", propName, propValue));
}
}
再次,这个小提琴演示了完整的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句