C# 更改类的私有成员的值

C# 更改类的私有成员的值,c#,C#,假设我有一个班级学生,其中包含一个私人成员StudentID。现在我在另一个班级里做了一个学生班级的对象,我的要求是改变学生ID的价值。是否可以访问StudentID并更改其值?您可以将访问私有成员值的学生类的属性设置为Public public class Student { private int _StudentId; public int StudentId { get { return _StudentI

假设我有一个班级学生,其中包含一个私人成员StudentID。现在我在另一个班级里做了一个学生班级的对象,我的要求是改变学生ID的价值。是否可以访问StudentID并更改其值?

您可以将访问私有成员值的
学生
类的
属性设置为Public

public class Student
{
    private int _StudentId;

    public int StudentId
    {
        get
        {
            return _StudentId;
        }
        set
        {
            _StudentId = value;
        }
    }
}
现在你可以这样使用它了

    Student objStudent = new Student();
    objStudent.StudentId = 5;  // your Id

您可以将访问私有成员
\u StudentId

public class Student
{
    private int _StudentId;

    public int StudentId
    {
        get
        {
            return _StudentId;
        }
        set
        {
            _StudentId = value;
        }
    }
}
现在你可以这样使用它了

    Student objStudent = new Student();
    objStudent.StudentId = 5;  // your Id

不,你不能。您需要具有访问学生ID私有成员的公共属性,或者可以使用某些公共方法访问它

不,你不能。您需要具有访问学生ID私有成员的公共属性,或者可以使用某些公共方法访问它

也许在构造函数中传递ID值是有意义的,所以我会添加另一个构造函数,它接受
StudentID

的一些值,也许在构造函数中传递ID值是有意义的,所以我会添加另一个构造函数,它接受
StudentID
的一些值。您可以将其公开:

public int StudentId {get;set;}
或者,您可以使用单独的方法进行更改:

private int StudentId;

public void ChangeStudentId(int NewStudentId)
{
    StudentId = NewStudentId;
}

你可以公开:

public int StudentId {get;set;}
或者,您可以使用单独的方法进行更改:

private int StudentId;

public void ChangeStudentId(int NewStudentId)
{
    StudentId = NewStudentId;
}

干净的方法是将其设置为公共属性,或者至少提供一个公共方法来更改id

public StudentID {get; set;}

// or
public StudentID {get; private set;}
public ChangeStudentID(int newID);
肮脏的方式是反射:

var instance = new Student();
var type = instance.GetType();
var propInfo = type.GetProperty("StudentID", BindingFlags.Instance | BindingFlags.NonPublic);
propInfo.SetValue(instance, 14, null);

干净的方法是将其设置为公共属性,或者至少提供一个公共方法来更改id

public StudentID {get; set;}

// or
public StudentID {get; private set;}
public ChangeStudentID(int newID);
肮脏的方式是反射:

var instance = new Student();
var type = instance.GetType();
var propInfo = type.GetProperty("StudentID", BindingFlags.Instance | BindingFlags.NonPublic);
propInfo.SetValue(instance, 14, null);

您需要将其封装在公共方法中。最简单的方法(如果您使用的是Visual Studio Pro或更高版本)是右键单击声明它的属性,移动到“重构”上,然后单击“封装字段”。VS自动生成get和set修饰符。您可以删除eiter以使属性为只读或只读

如果属性声明为“int studentId”,则生成的封装将位于“Student.studentId”(注意大写字母)。如果属性被声明为“int StudentId”,那么就我记忆所及,封装将默认为“Student.StudentId_1”。您可以在创建过程中选择自己的名称

如果您使用的是Visual Studio Express或其他编辑器,请执行以下操作:

public int StudentId() { return this.studentId; }

您需要将其封装在公共方法中。最简单的方法(如果您使用的是Visual Studio Pro或更高版本)是右键单击声明它的属性,移动到“重构”上,然后单击“封装字段”。VS自动生成get和set修饰符。您可以删除eiter以使属性为只读或只读

如果属性声明为“int studentId”,则生成的封装将位于“Student.studentId”(注意大写字母)。如果属性被声明为“int StudentId”,那么就我记忆所及,封装将默认为“Student.StudentId_1”。您可以在创建过程中选择自己的名称

如果您使用的是Visual Studio Express或其他编辑器,请执行以下操作:

public int StudentId() { return this.studentId; }
简言之,没有

在长:视情况而定

您可以通过属性公开私有字段

private int _studentID;
public int StudentID
{
   get { return _studentID; }
   set { _studentID = value; }
}
但不知怎么的,我不认为那是你想要的

私有字段是私有的是有原因的如果您不希望它是私有的,那么就不要让它私有,或者通过如上所示的属性公开它

如果确实需要访问私有字段并设置其值,则可以采用反射路径:

var a = new abc();
a.GetType().GetField("x", 
   System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(a, 12);
获取类型,然后使用实例和非公共字段拉出字段,然后只设置值

因此:

这是“正确”的方法,但是使用反射你可以做到

var someclass = new SomeClass();
        someclass.GetType()
            .GetField("_studentID",
                System.Reflection.BindingFlags.NonPublic |
                 System.Reflection.BindingFlags.Instance)
            .SetValue(someclass, 12);
如果要使用反射,则可以使用扩展方法帮助器:

public static class FieldExtensions
{
    public static void SetPrivateField<T>(this T instance, string field, object value)
    {
        typeof(T).GetField(field, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
            .SetValue(instance, value);
    }
}
简言之,没有

在长:视情况而定

您可以通过属性公开私有字段

private int _studentID;
public int StudentID
{
   get { return _studentID; }
   set { _studentID = value; }
}
但不知怎么的,我不认为那是你想要的

私有字段是私有的是有原因的如果您不希望它是私有的,那么就不要让它私有,或者通过如上所示的属性公开它

如果确实需要访问私有字段并设置其值,则可以采用反射路径:

var a = new abc();
a.GetType().GetField("x", 
   System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(a, 12);
获取类型,然后使用实例和非公共字段拉出字段,然后只设置值

因此:

这是“正确”的方法,但是使用反射你可以做到

var someclass = new SomeClass();
        someclass.GetType()
            .GetField("_studentID",
                System.Reflection.BindingFlags.NonPublic |
                 System.Reflection.BindingFlags.Instance)
            .SetValue(someclass, 12);
如果要使用反射,则可以使用扩展方法帮助器:

public static class FieldExtensions
{
    public static void SetPrivateField<T>(this T instance, string field, object value)
    {
        typeof(T).GetField(field, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
            .SetValue(instance, value);
    }
}

在这种情况下,您可以使用反射:

FieldInfo StudentIDField= typeof(Student).GetField("StudentId",BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
StudentIDField.SetValue(1);

在这种情况下,您可以使用反射:

FieldInfo StudentIDField= typeof(Student).GetField("StudentId",BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
StudentIDField.SetValue(1);

你可以通过多种方式改变它。。。您可以将其改为
公共
属性,也可以使用反射来更改它

事实上,如果您的代码更改了StudentID,而现在又与另一个学生发生冲突,该怎么办?如果要创建一个控制学生的类,例如
StudentCollection
,则该类可以有一个
ChangeId
,如下所示:

public class StudentCollection : List<Student>
{
   public void ChangeId(Student student, int newId) 
   {
      if(students.Where(s => s.Id == newId).Count() > 0)
         throw new ArgumentException("A student already has that Id");

      student.Id = newId;
   }
}
公共班级学生集合:列表
{
public void ChangeId(Student-Student,int-newId)
{
if(students.Where(s=>s.Id==newId).Count()>0)
抛出新的ArgumentException(“学生已经拥有该Id”);
student.Id=newId;
}
}

此时,您可以将Id设置为内部Id,或使用方法尝试减少有人直接修改它的可能性。

您可以通过多种方式更改它。。。您可以将其改为
公共
属性,也可以使用反射来更改它

事实上,如果您的代码更改了StudentID,而现在又与另一个学生发生冲突,该怎么办?如果要创建一个控制学生的类,例如
StudentCollection
,则该类可能会有一个
ChangeI