当基类中的属性没有设置器时,PropertyInfo.SetValue()不起作用

时间:2019-12-11 21:29:57

标签: c# .net reflection

我正在使用反射来获取对象。最初,我创建了一个不带setter的“ Id”属性的类,因为我不希望框架的用户为Id属性设置值:

public class Client {
    public int? Id { get; private set; }
    public string Name { get; set; }
    public string Email { get; set; }

    public Client(string name, string email) {
        Id = null;
        Name = name;
        Email = email;
    }
}

使用反射,我可以使用以下代码为Id属性设置值:

foreach (PropertyInfo prop in obj.GetType().GetProperties()) {
    if (prop.Name == "Id") {
       prop.SetValue(obj, id);
       break;
    }
}

但是当我使用继承时,PropertyInfo.SetValue不适用于Id属性:

public abstract class Client {
    public int? Id { get; private set; }
    public string Name { get; set; }
    public string Email { get; set; }

    public Client(string name, string email) {
        Id = null;
        Name = name;
        Email = email;
    }
}

public class PhysicalPerson : Client {
        public string CPF { get; set; }
        public DateTime BirthDate { get; set; }

        public PhysicalPerson(string name, string email, string cpf, DateTime birthDate) : base(name, email) { 
            CPF = cpf;
            BirthDate = birthDate;
        }
    }

执行prop.SetValue()时,它将返回异常“找不到属性设置方法”。 我知道Id属性没有二传手,但是为什么在没有继承的情况下它可以工作? 我真的很想保留Id属性而不使用二传手。有谁知道如何避免这种情况?

1 个答案:

答案 0 :(得分:0)

private的setter方法上使用Id修饰符时,属性具有一个SetMethod(),但只能在{{1 }}类。因此,您可以使用反射来设置值。但是,如果删除Client,则会在没有继承的情况下在代码中产生类似的错误。试试这个:

set;

相反,当您从基类继承新类时,public int? Id { get; } 的设置方法不会被继承,Id将为null。现在,您将使用尚未继承SetMethod()的子级来设置值,并且实际上set;的{​​{1}}属性的PhysicalPerson为空。