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