我有个小班
public class ExcitingResults
{
public int A { get; set; }
public string B { get; set; }
public DateTime C { get; set; }
public string ComplexD
{
get { return SomeMethod("A", "B"); }
}
}目前,我对结果进行了一些处理,这是一个创建JSON或Excel文件的List<ExcitingResults>。此处理强烈地依赖于每个属性的名称,输出中出现的事物的顺序由它们在类中出现的顺序来定义。尽管事实上,这是一种未定义的行为,如果编译器决定要以不同的顺序进行操作,这种情况可能会发生变化。
出于这个原因,我想把我的课改成这样。
public class ExcitingResults
{
public column<int> A { get; set; }
public column<string> B { get; set; }
public column<DateTime> C { get; set; }
public column<string> ComplexD
{
get { return SomeMethod(A.Name, B.Name); }
}
}
public class column<T>
{
public T Value { get; set; }
public string Name { get; set; }
}很明显这不是一滴替代品..。有没有什么聪明的策略,我可以采取的改变,使这种变化,尽可能不痛苦。然后,将来会给Column类增加复杂性,比如order、友好的名称和其他我想到的属性。
或者这是一种疯狂的前进方式,我应该考虑另一种策略,以便能够将这些额外的信息添加到列中?
发布于 2015-12-30 17:06:34
您可以添加属性属性,其优点是不接触类的API。例如,添加类:
[AttributeUsage(AttributeTargets.Property)]
public class ColumnAttribute : System.Attribute {
public string FriendlyName { get; set; }
public int Rank { get; set; }
}您现在可以这样注释您的ExcitingResults类:
public class ExcitingResults {
[Column(FriendlyName = "A", Rank = 1)]
public int A { get; set; }
[Column(FriendlyName = "B", Rank = 4)]
public string B { get; set; }
[Column(FriendlyName = "C", Rank = 3)]
public DateTime C { get; set; }
[Column(FriendlyName = "D", Rank = 2)]
public string ComplexD {
get { return SomeMethod("A", "B"); }
}
}然后,您的处理器类可以使用反射访问属性属性。例如,按ExcitingResult的顺序打印Rank属性。
public static void Process(ExcitingResults result) {
var propertiesByRank = typeof(ExcitingResults)
.GetProperties()
.OrderBy(x => x.GetCustomAttribute<ColumnAttribute>().Rank);
foreach (var propertyInfo in propertiesByRank) {
var property = result.GetType().GetProperty(propertyInfo.Name);
var propertysFriendlyName = property.GetCustomAttribute<ColumnAttribute>().FriendlyName;
var propertysValue = property.GetValue(result, null);
Console.WriteLine($"{propertysFriendlyName} = {propertysValue}");
}
}https://stackoverflow.com/questions/34532153
复制相似问题