我正在使用反射来获取对象。最初,我创建了一个不带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属性而不使用二传手。有谁知道如何避免这种情况?
答案 0 :(得分:0)
在private
的setter方法上使用Id
修饰符时,属性具有一个SetMethod()
,但只能在{{1 }}类。因此,您可以使用反射来设置值。但是,如果删除Client
,则会在没有继承的情况下在代码中产生类似的错误。试试这个:
set;
相反,当您从基类继承新类时,public int? Id { get; }
的设置方法不会被继承,Id
将为null。现在,您将使用尚未继承SetMethod()
的子级来设置值,并且实际上set;
的{{1}}属性的PhysicalPerson
为空。