introduce c# generator options
diff --git a/src/compiler/csharp_generator.cc b/src/compiler/csharp_generator.cc
index 08cd41d..5744d7c 100644
--- a/src/compiler/csharp_generator.cc
+++ b/src/compiler/csharp_generator.cc
@@ -566,7 +566,8 @@
 
 }  // anonymous namespace
 
-grpc::string GetServices(const FileDescriptor *file) {
+grpc::string GetServices(const FileDescriptor *file, bool generate_client,
+                         bool generate_server) {
   grpc::string output;
   {
     // Scope the output stream so it closes and finalizes output to the string.
@@ -594,7 +595,7 @@
     out.Print("namespace $namespace$ {\n", "namespace", GetFileNamespace(file));
     out.Indent();
     for (int i = 0; i < file->service_count(); i++) {
-      GenerateService(&out, file->service(i), true, true);
+      GenerateService(&out, file->service(i), generate_client, generate_server);
     }
     out.Outdent();
     out.Print("}\n");
diff --git a/src/compiler/csharp_generator.h b/src/compiler/csharp_generator.h
index 90eb7e2..79c2e57 100644
--- a/src/compiler/csharp_generator.h
+++ b/src/compiler/csharp_generator.h
@@ -40,7 +40,8 @@
 
 namespace grpc_csharp_generator {
 
-grpc::string GetServices(const grpc::protobuf::FileDescriptor *file);
+grpc::string GetServices(const grpc::protobuf::FileDescriptor *file,
+                         bool generate_client, bool generate_server);
 
 }  // namespace grpc_csharp_generator
 
diff --git a/src/compiler/csharp_plugin.cc b/src/compiler/csharp_plugin.cc
index bc86fbd..fd1ec99 100644
--- a/src/compiler/csharp_plugin.cc
+++ b/src/compiler/csharp_plugin.cc
@@ -51,7 +51,22 @@
     std::vector<std::pair<grpc::string, grpc::string> > options;
     grpc::protobuf::compiler::ParseGeneratorParameter(parameter, &options);
 
-    grpc::string code = grpc_csharp_generator::GetServices(file);
+    bool generate_client = true;
+    bool generate_server = true;
+    for (size_t i = 0; i < options.size(); i++) {
+      if (options[i].first == "no_client") {
+        generate_client = false;
+      } else if (options[i].first == "no_server") {
+        generate_server = false;
+      } else {
+        *error = "Unknown generator option: " + options[i].first;
+        return false;
+      }
+    }
+
+    grpc::string code = grpc_csharp_generator::GetServices(file,
+                                                           generate_client,
+                                                           generate_server);
     if (code.size() == 0) {
       return true;  // don't generate a file if there are no services
     }