C# PropertyInfo.SetValue()不';基类中的属性不';我没有二传手

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) {

我使用反射来获取对象。最初,我创建了一个没有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;
    }
}
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)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)private set
一起使用。谢谢您。我将修改器从私有改为受保护,现在可以正常工作了。谢谢你,哈迪。我将修改器从private改为protected,现在可以正常工作了。