首页 > 解决方案 > 是否可以覆盖复杂类型的 GetValue() 方法?

问题描述

我有一Job堂课如下:

public class Job
{
    public string JobTitle { get; set; }
    public SalaryRange SalaryRange { get; set; }
}

public class SalaryRange
{
    public decimal MinSalary { get; set; }
    public decimal MaxSalary { get; set; }
}

现在我想计算 job 的校验和object。此校验和的目的是指示是否修改了作业的任何属性......所以我想构建一个包含其所有属性值的字符串并获取此字符串的校验和:

[TestMethod]
public void Calculate_job_checksum()
{
    var salary = new SalaryRange()
    {
        MinSalary = 15,
        MaxSalary = 20
    };
    
    vat job = new Job()
    {
        JobTitle= "Civil Engineer",
        SalaryRange = salary
    };
    
    string stringifiedValues = "";
    PropertyInfo[] properties = job.GetType().GetProperties();
    foreach (PropertyInfo p in properties)
    {
        if (p.CanRead))
        {
            // combine all values
            var val = p.GetValue(job);
            stringifiedValues += val.ToString();
        }
    }

    // get the checksum
    jobChecksum = stringifiedValues.GetChecksum();
}

问题是GetValue()没有SalaryRange正确获取复杂类型(即)的值,它返回类的命名空间,即值为stringifiedValues

"Civil EngineerMySolutionName.ProjectName.FolderName"

是否可以覆盖或更改GetValue()返回嵌套属性的字符串化值的行为?

标签: c#reflectionpropertyinfo

解决方案


它可以很好地获取价值;问题是value是一个SalaryRange实例,默认object.ToString()实现是写类型名。你可以覆盖它:

public class SalaryRange
{
    public decimal MinSalary { get; set; }
    public decimal MaxSalary { get; set; }
    public override string ToString() => $"{MinSalary}-{MaxSalary}"; // for example
}

推荐阅读