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

标签 c# refactoring

我有一个小课

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

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

最佳答案

您可以添加属性特性,其优点是无需触及类的 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/

相关文章:

c# - 如何仅在 Unity3d 中使用 C# 打开/关闭 android 手电筒

c# - 正确的 Objective-C Helper "Wannabe"私有(private)方法?

c# - 内存平铺管理和大对象 C#

java - 在java中, "public static void main"可以重命名或重构吗?

php - 用JS/jQuery编写此代码的最佳方法是什么? (具有多个字段的多个单个对象)

c# - C#:在Tuple中使用Task <>

c++ - 我怎样才能避免这种代码重复?

C#重构代码

c++ - 如何优化/重构这样的代码?

c# - c# 客户端应用程序中用户设置/配置的最佳实践