首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将简单的类成员重构为更复杂的类型?

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

Stack Overflow用户
提问于 2015-12-30 15:16:53
回答 1查看 71关注 0票数 2

我有个小班

代码语言:javascript
复制
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>。此处理强烈地依赖于每个属性的名称,输出中出现的事物的顺序由它们在类中出现的顺序来定义。尽管事实上,这是一种未定义的行为,如果编译器决定要以不同的顺序进行操作,这种情况可能会发生变化。

出于这个原因,我想把我的课改成这样。

代码语言:javascript
复制
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、友好的名称和其他我想到的属性。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-30 17:06:34

您可以添加属性属性,其优点是不接触类的API。例如,添加类:

代码语言:javascript
复制
[AttributeUsage(AttributeTargets.Property)]
public class ColumnAttribute : System.Attribute {
    public string FriendlyName { get; set; }
    public int Rank { get; set; }
}

您现在可以这样注释您的ExcitingResults类:

代码语言:javascript
复制
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属性。

代码语言:javascript
复制
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 文档教程

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34532153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档