gpt4 book ai didi

c# - 如何将简单的类成员重构为更复杂的类型?

转载 作者:行者123 更新时间:2023-11-30 23:31:40 25 4
gpt4 key购买 nike

我有一点课

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"); }
}
}

目前我对结果进行了一些处理 List<ExcitingResults>创建 JSON 或 Excel 文件。此处理强烈依赖于每个属性的名称,并且事物在输出中出现的顺序由它们在类中出现的顺序定义。尽管实际上这是未定义的行为,因此如果编译器决定它想要以不同的顺序排列事物,则可能会发生变化。

出于这个原因,我想将我的类(class)改成这样。

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类,例如我想到的顺序、友好名称和其他属性。

或者这是一个疯狂的前进方式,我应该考虑另一种策略,以便能够将这些额外信息添加到列中?

最佳答案

您可以添加 property 特性,优点是您不接触类的 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"); }
}
}

然后您的处理器类可以使用反射访问属性属性。例如,要按照 Rank 的顺序打印出 ExcitingResult 的属性:

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}");
}
}

您会希望在您的处理类中进行更多的错误检查,但您明白了。请参阅 MSDN documentationtutorial了解更多信息。

关于c# - 如何将简单的类成员重构为更复杂的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com