Несмотря на то, что ответ Правина верен и, без сомнения, служит для однократного использования, ему не хватает некоторой безопасности типов, чтобы использовать это в тестах над сильной моделью домена снова и снова. Поэтому я обернул его в метод расширения, который позволяет вам этот безопасный вызов типа для установки значения:
var classWithPrivateSetters= new ClassWithPrivateSetters();
classWithPrivateSetters.SetPrivate(cwps => cwps.Number, 42);
Вставьте это в свою тестовую сборку, и все готово
public static class PrivateSetterCaller
{
public static void SetPrivate<T,TValue>(this T instance, Expression<Func<T,TValue>> propertyExpression, TValue value)
{
instance.GetType().GetProperty(GetName(propertyExpression)).SetValue(instance, value, null);
}
private static string GetName<T, TValue>(Expression<Func<T, TValue>> exp)
{
MemberExpression body = exp.Body as MemberExpression;
if (body == null)
{
UnaryExpression ubody = (UnaryExpression)exp.Body;
body = ubody.Operand as MemberExpression;
}
return body.Member.Name;
}
}