private static void RequiresCanWrite(Expression expression, string paramName) { if (expression == null) { throw new ArgumentNullException(paramName); } switch (expression.NodeType) { case ExpressionType.Index: PropertyInfo indexer = ((IndexExpression)expression).Indexer; if (indexer == null || indexer.CanWrite) { return; } break; case ExpressionType.MemberAccess: MemberInfo member = ((MemberExpression)expression).Member; PropertyInfo prop = member as PropertyInfo; if (prop != null) { if (prop.CanWrite) { return; } } else { Debug.Assert(member is FieldInfo); FieldInfo field = (FieldInfo)member; if (!(field.IsInitOnly || field.IsLiteral)) { return; } } break; case ExpressionType.Parameter: return; } throw Error.ExpressionMustBeWriteable(paramName); }