C# PropertyInfo.SetValue()不';基类中的属性不';我没有二传手
我使用反射来获取对象。最初,我创建了一个没有setter的带有“Id”属性的类,因为我不希望框架的用户为Id属性设置值:C# PropertyInfo.SetValue()不';基类中的属性不';我没有二传手,c#,.net,reflection,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) {
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;
}
}
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;
}
}
使用反射,我可以使用以下代码为Id属性设置一个值:
foreach (PropertyInfo prop in obj.GetType().GetProperties()) {
if (prop.Name == "Id") {
prop.SetValue(obj, id);
break;
}
}
但是当我使用继承时,PropertyInfo.SetValue对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;
}
}
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()时,它返回异常“Property set method not found”。
我知道Id属性没有setter,但是为什么它在没有继承的情况下工作呢?
我真的希望在没有setter的情况下保留Id属性。有人知道如何避免这种情况吗 当
private
修饰符应用于Id
的setter方法时,属性具有SetMethod()
,但它只能在客户端
类中访问。因此,可以使用反射设置值。但是如果您删除集代码>,它在没有继承的代码中产生类似的错误。试试这个:
public int? Id { get; }
相反,当您从基类继承新类时,Id
的setter不会被继承,SetMethod()
将为空。现在,您将使用未继承集的子级设置一个值
和实际上PhysicalPerson
的Id
属性的SetMethod()
是空的。当私有的修饰符应用于Id
的setter方法时,该属性具有SetMethod()
但它只能在客户端中访问。因此,可以使用反射设置值。但是如果您删除集代码>,它在没有继承的代码中产生类似的错误。试试这个:
public int? Id { get; }
相反,当您从基类继承新类时,Id
的setter不会被继承,SetMethod()
将为空。现在,您将使用未继承集的子级设置一个值
以及实际上PhysicalPerson
的Id
属性的SetMethod()
为空。尝试将setter更改为内部,私有setter只能在构造函数中使用。var flags=BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.GetProperty;var person=新物理人员(…);person.GetType().BaseType.GetProperty(“Id”,标志).SetValue(person,100)谢谢Jimi。我用了“受保护”这个词,效果很好。哈迪在他的回答中解释了发生了什么。“受保护”会将setter传播到继承的类(private不会)。该代码也可与private set
一起使用。请尝试将setter更改为内部,private setter只能在构造函数中使用。var flags=BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.GetProperty;var person=新物理人员(…);person.GetType().BaseType.GetProperty(“Id”,标志).SetValue(person,100)谢谢Jimi。我用了“受保护”这个词,效果很好。哈迪在他的回答中解释了发生了什么。“Protected”将setter传播到继承的类(private不会)。该代码也可以与private set
一起使用。谢谢您。我将修改器从私有改为受保护,现在可以正常工作了。谢谢你,哈迪。我将修改器从private改为protected,现在可以正常工作了。