C#でprivateなプロパティに値を設定する。

毎回忘れるのでメモしておきます。

こういうクラスがあるとします。

public class Student
{
	public string Name { get; private set; }
	public bool Exists { get; private set; }
	// 唯一のコンストラクタ	
	public Student()
	{
		// DBから値取得など
	}
}

いろいろな事情で上記クラスの振る舞いを変えられない場合は、
利用者側からプロパティの値を設定する場合は下記のように設定します。

class ConsoleApp
{
	static void Main(string[] args)
	{
		var student = new Student();
		var type = student.GetType();
		var propName = type.GetProperty("Name");
		var propExists = type.GetProperty("Exists");
		propName.SetValue(student, "Suzuki", null);
		propExists.SetValue(student, true, null);	
	}
}

ただし、どういう事情があるにせよこのようなコードはプロダクトコードに存在すべきではないと思います。
このようなコードが活躍するのはテストコードやデバックのために一時的に変更する場合です。
プロダクトコードの中でこのようなコードがある場合はクラスの振る舞いを疑ってコードを改修すべきです。